C二维数组的转置

#include <stdio.h>
#define N 3

void convertMethod(int arr[N][N]);
void printMethod(int arr[N][N]);
int main()
{
    int arr[N][N] = { {1,2,3},{4,5,6},{7,8,9} };
    convertMethod(arr);
    printMethod(arr);
    system("pause");
    return 0;
}
//二位数组的转置
// 1 2 3        1 4 7
// 4 5 6  转置为2 5 8
// 7 8 9        3 6 9
// 分析arr[0][0] arr[1][1] arr[2][2]不变
//arr[0][1]与arr[1][0] arr[0][2]与arr[2][0] arr[1][2]与arr[2][1]交换
void convertMethod(int arr[N][N])
{
    //看起来思路没有问题 但实际上忽略了二重循环的影响
    //举个例子 当i=2时  arr[2][0]与arr[0][2]又进行了交换 但是要知道早在i=0时 arr[0][2]与arr[2][0]就进行了交换
    //思考实验下外层循环 i<N-1 i<N-2会怎么样
    //for (int i = 0; i < N; i++)
    //{
    //    for (int j = 0; j < N; j++)
    //    {
    //        int temp = arr[i][j];
    //        arr[i][j] = arr[j][i];
    //        arr[j][i] = temp;
    //    }
    //}
    //再重新仔细分析下 arr[0][1]与arr[1][0] arr[0][2]与arr[2][0] arr[1][2]与arr[2][1]
    for (int i = 0; i < N; i++)
    {
        for (int j = i + 1; j < N; j++)
        {
            int temp = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = temp;
        }
    }
}
void printMethod(int arr[N][N])
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            printf("%d", arr[i][j]);
        }
        printf("\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/littlelittleprince/p/12297110.html