Как создать горизонтально зеркальную инверсию 2d матрицы c ++? - PullRequest
1 голос
/ 23 апреля 2020

Например, если ввод:

21 26 31 36
22 27 32 37
23 28 33 38
24 29 34 39
25 30 35 40

, вывод должен быть:

25 30 35 40
24 29 34 39
23 28 33 38
22 27 32 37
21 26 31 36

Все строки меняются местами до средней строки.

первый ряд должен поменяться местами с последним, второй - с последним последним рядом, и т. д. c ...

Это мой код:

int A[100][100] = { 0 };
int n, m;
std::cin >> n >> m;


for (int k = 0, j = n - 1; k < j; k++, --j)
     std::swap(A[k], A[j]);

number of rows(n), columns(m), for n, m < 100 Он показывает мне ту же матрицу, что и раньше.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете поменять местами двумерный массив, используя std :: reverse :

#include <algorithm>
#include <iostream>

int main()
{
    int A[100][100] = { {21, 26, 31, 36},
                        {22, 27, 32, 37},
                        {23, 28, 33, 38},
                        {24, 29, 34, 39},
                        {25, 30, 35, 40} };

    std::reverse(&A[0], &A[5]);  // Starting and ending ranges are &A[0] and &A[5]

    // Output results
    for (int i = 0; i < 5; ++i)
    {
        for (int j = 0; j < 4; ++j)
            std::cout << A[i][j] << " ";
        std::cout << "\n";
    }
}

Вывод:

25 30 35 40 
24 29 34 39 
23 28 33 38 
22 27 32 37 
21 26 31 36 
1 голос
/ 23 апреля 2020

Вы можете поменять местами двумерный массив, используя стандартный алгоритм std::swap_ranges или написав «вручную» al oop.

Вот демонстрационная программа.

#include <iostream>
#include <iterator>
#include <algorithm>

int main() 
{
    const size_t M = 5, N = 4;
    int a[M][N] = 
    {
        { 21, 26, 31, 36 },
        { 22, 27, 32, 37 },
        { 23, 28, 33, 38 },
        { 24, 29, 34, 39 },
        { 25, 30, 35, 40 }
    };

    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }
    std::cout << '\n';

    std::swap_ranges( std::begin( a ), std::next( std::begin( a ), M / 2 ), 
                      std::rbegin( a ) );

    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }
    std::cout << '\n';

    for ( std::size_t i = 0; i < N / 2; i++ )
    {
        std::swap( a[i], a[M - i - 1] );
    }

    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }
    std::cout << '\n';

    return 0;
}

Его вывод

21 26 31 36 
22 27 32 37 
23 28 33 38 
24 29 34 39 
25 30 35 40 

25 30 35 40 
24 29 34 39 
23 28 33 38 
22 27 32 37 
21 26 31 36 

21 26 31 36 
22 27 32 37 
23 28 33 38 
24 29 34 39 
25 30 35 40 

Обратите внимание, что массивы переменной длины не являются стандартной функцией C ++. Это означает, что размеры массива должны быть известны во время компиляции. Если вы хотите, чтобы пользователь вводил размеры, используйте стандартный шаблон класса std::vector.

Если у вас уже есть определенный массив с некоторыми максимальными значениями его размеров, и пользователь может указать его sub -array, тогда массив должен быть как минимум инициализирован нулями

...