C 奇数行反转矩阵转置

C 奇数行反转矩阵转置,c,arrays,algorithm,matrix,C,Arrays,Algorithm,Matrix,我知道如何转换矩阵,但是如何转换奇数行反转形式的矩阵 示例3*3矩阵 1 2 3 4 5 6 7 8 9 输出 1 6 7 2 5 8 3 4 9 如果我正确理解了作业,那么程序可以按照以下方式运行 #include <stdio.h> #define MAX_VALUE 100 int main(void) { while ( 1 ) { printf( "Enter the size of an array (0 - Exit):

我知道如何转换矩阵,但是如何转换奇数行反转形式的矩阵

示例3*3矩阵

  • 1 2 3
  • 4 5 6
  • 7 8 9
输出

  • 1 6 7
  • 2 5 8
  • 3 4 9

如果我正确理解了作业,那么程序可以按照以下方式运行

#include <stdio.h>

#define MAX_VALUE   100

int main(void) 
{
    while ( 1 )
    {
        printf( "Enter the size of an array (0 - Exit): " );

        size_t n;

        if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;

        putchar('\n');

        n %= MAX_VALUE;

        int a[n][n];

        for ( size_t i = 0; i < n; i++ )
        {
            for ( size_t j = 0; j < n; j++ )
            {
                a[i][j] = n * i + j;
            }
        }

        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = 0; j < n; j++)
            {
                printf("%3d ", a[i][j]);
            }

            putchar('\n');
        }

        putchar('\n');

        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = i; j < n; j++)
            {
                if (j % 2 == 1 && i < n / 2)
                {
                    int tmp = a[j][i];
                    a[j][i] = a[j][n - i - 1];
                    a[j][n - i - 1] = tmp;
                }
                if (i != j)
                {
                    int tmp = a[i][j];
                    a[i][j] = a[j][i];
                    a[j][i] = tmp;
                }
            }
        }

        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = 0; j < n; j++)
            {
                printf("%3d ", a[i][j]);
            }

            putchar('\n');
        }

        putchar('\n');
    }

    return 0;
}

编译器应该支持可变长度数组。否则,您可以为固定大小的数组重写程序。

这里有一个解决方案,可以将问题分解为更小的子问题。函数
reverse_row()
是一个反转在位数组的函数,函数
transpose_array()
是一个在位转置数组的函数

第一个函数,
reverse\u row()
在具有奇数索引的2d数组行上以循环方式调用,然后在生成的数组上调用
transpose\u array()
函数。注意,测试
if(i%2){}
用于确定数组索引是奇数还是偶数,因为
i%2
仅在
i
为偶数时才计算为
0
;您也可以避免此测试,只需在每次迭代时(从1开始)将
i
增加2,如注释中所示:

for (size_t i = 1; i < MATRIX_SZ; i += 2) {
    reverse_row(MATRIX_SZ, array[i]);
    }

编写一个函数来反转行,并在将函数应用于转置之前应用它。问题是,我只想反转(size_t I=0;I的矩阵
的奇数行。若要就地反转数组,可以交换第一个和最后一个元素,然后交换第二个和下一个元素,依此类推,直到到达数组的中间。谢谢,我将尝试@DavidBowling@DavidBowling将
i++
更改为
i++=2
将避免对模的需要
for (size_t i = 1; i < MATRIX_SZ; i += 2) {
    reverse_row(MATRIX_SZ, array[i]);
    }
#include <stdio.h>

#define MATRIX_SZ  4

void print_array(size_t n, int arr[n][n]);
void reverse_row(size_t n, int arr[n]);
void transpose_array(size_t n, int arr[n][n]);

int main(void)
{
    int array[MATRIX_SZ][MATRIX_SZ] = { { 1, 2, 3, 4 },
                                        { 5, 6, 7, 8 },
                                        { 9, 10, 11, 12 },
                                        { 13, 14, 15, 16 } };

    puts("Before transformation:");
    print_array(MATRIX_SZ, array);
    putchar('\n');

    for (size_t i = 0; i < MATRIX_SZ; i++) {
        if (i % 2) {
            reverse_row(MATRIX_SZ, array[i]);
        }
    }
    transpose_array(MATRIX_SZ, array);

    puts("After transformation:");
    print_array(MATRIX_SZ, array);
    putchar('\n');

    return 0;
}

void print_array(size_t n, int arr[n][n])
{
    for (size_t i = 0; i < n; i++) {
        for (size_t j = 0; j < n; j++) {
            printf("%5d", arr[i][j]);
        }
        putchar('\n');
    }
}

void reverse_row(size_t n, int arr[n])
{
    size_t mid = n / 2;
    for (size_t i = 0; i < mid; i++) {
        size_t swap_dx = n - 1 - i;
        int temp = arr[i];
        arr[i] = arr[swap_dx];
        arr[swap_dx] = temp;
    }
}

void transpose_array(size_t n, int arr[n][n])
{
    for (size_t i = 0; i < n; i++) {
        for (size_t j = 0; j < i; j++) {
            int temp = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = temp;
        }
    }
}