Функция Swap не меняет местами элементы 2D-массива в c ++ - PullRequest
2 голосов
/ 21 января 2020

Так что эта функция транспонирования должна обменивать элементы 2d-массива, но не меняет их.

Вывод программы совпадает с ее вводом.

input:
      1 2 3 4 5 6 7 8 9
output:
      123456789

Я даже пытался заменить Функция подкачки с моим кодом подкачки, в котором вы используете переменную temp, чтобы поменять местами два элемента, которые тоже не работают, поэтому я понятия не имею, что происходит.

void transpose(int input_arr[][3], int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                swap(input_arr[i][j], input_arr[j][i]);
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cout << input_arr[i][j];
            }
        }
    }

    int main()
    {
        const int n = 3;
        int row = 3;
        int col = 3;
        int input_arr[n][n];

        arr(input_arr, n);
        transpose(input_arr, n);
    }

1 Ответ

3 голосов
/ 21 января 2020

Вы делаете слишком много свопов. :)

Например, когда i равно 0 и j равно 1 вы меняете

input_arr[0][1] and input_arr[1][0]

Когда i равно 1 и j равно 0, вы снова меняете местами

input_arr[1][0] and input_arr[0][1]

только в обратном порядке.

Могу предложить следующее решение

#include <iostream>
#include <utility>

template <typename T, size_t N>
void transpose( T ( &a )[N][N] )
{
    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = i + 1; j < N; j++ ) 
        {
            std::swap( a[i][j], a[j][i] );
        }           
    }
}

template <typename T, size_t N>
std::ostream & display( const T ( &a )[N][N],std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            os << a[i][j] << ' ';
        }
        os << '\n';
    }

    return os;
}

int main() 
{
    const size_t N1 = 3;
    int a1[N1][N1] =
    {
        { 1, 2, 3 },
        { 4, 5, 6 },
        { 7, 8, 9 }
    };

    display( a1 ) << '\n';

    transpose( a1 );

    display( a1 ) << '\n';

    const size_t N2 = 4;
    char a2[N2][N2] =
    {
        { 'A', 'B', 'C', 'D' }, 
        { 'E', 'F', 'G', 'H' },
        { 'I', 'J', 'K', 'L' },
        { 'M', 'N', 'O', 'P' }
    };

    display( a2 ) << '\n';

    transpose( a2 );

    display( a2 ) << '\n';

    return 0;
}

Вывод программы:

1 2 3 
4 5 6 
7 8 9 

1 4 7 
2 5 8 
3 6 9 

A B C D 
E F G H 
I J K L 
M N O P 

A E I M 
B F J N 
C G K O 
D H L P 
...