c - 顺时针旋转数组

标签 c arrays

假设我有这样的多维数组:

int arr[3][3] = {{1, 2, 3},
                 {4, 5, 6},
                 {7, 8, 9}};

我想顺时针旋转数组,这样它看起来像这样:

{{7, 4, 1},
 {8, 5, 2},
 {9, 6, 3}};

我试着用它们之前的值依次交换每个值:

    swap(&arr[0][0],&arr[0][1]);
    swap(&arr[0][1],&arr[0][2]);
    swap(&arr[0][2],&arr[1][2]);
    swap(&arr[1][2],&arr[2][2]);
    swap(&arr[2][2],&arr[2][1]);
    swap(&arr[2][1],&arr[2][0]);
    swap(&arr[2][0],&arr[1][0]);
    swap(&arr[1][0],&arr[0][0]);

这没有正确旋转。它保留了一些值,并将其他值放在错误的位置。

我做错了什么,我该如何实现?

最佳答案

您可能会注意到,旋转后,旋转后数组第一行的元素来自原始数组的第一列,与索引的顺序相反。同样,旋转数组的第二行来自原始数组的第二列,依此类推。考虑到这一点,您可以编写一个函数,用原始数组中的适当值填充新数组,然后再将新值复制到原始数组中。

函数 rotate_array() 遍历 rotated 数组。 rotated 的第 i 行的元素来自输入数组 a 的第 i 列。 rotated 的第 i 行的第 j 个元素是 的第 n-j-1 个元素a 的第 i 列。然后使用 memcpy() 函数将旋转数组的内容复制到原始数组中。

#include <stdio.h>
#include <string.h>

void print_array(size_t n, int a[n][n]);
void rotate_array(size_t n, int a[n][n]);

int main(void)
{
    size_t arr_sz = 5;
    int arr[arr_sz][arr_sz];

    for (size_t i = 0; i < arr_sz; i++) {
        for (size_t j = 0; j < arr_sz; j++) {
            arr[i][j] = i * arr_sz + j + 1;
        }
    }

    puts("Before rotation:");
    print_array(arr_sz, arr);
    putchar('\n');

    rotate_array(arr_sz, arr);
    puts("After rotation:");
    print_array(arr_sz, arr);
    putchar('\n');

    return 0;
}

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

void rotate_array(size_t n, int a[n][n])
{
    int rotated[n][n];
    for (size_t i = 0; i < n; i++) {
        for (size_t j = 0; j < n; j++) {
            rotated[i][j] = a[n - j - 1][i];
        }
    }
    memcpy(a, rotated, sizeof a[0][0] * n * n);
}
Before rotation:
    1    2    3    4    5
    6    7    8    9   10
   11   12   13   14   15
   16   17   18   19   20
   21   22   23   24   25

After rotation:
   21   16   11    6    1
   22   17   12    7    2
   23   18   13    8    3
   24   19   14    9    4
   25   20   15   10    5

关于c - 顺时针旋转数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44510376/

相关文章:

c - YAFFS 文件系统是否支持每 256 字节页面超过 1 位的 ECC?

python - 如何从 C 访问 Python 全局变量?

来自 mysql assoc 的 PHP 数组

c - 数学函数在现代处理器上需要多少周期

c - 删除部分字符串的函数

C - fscanf 错误与 char *

javascript - Blazor 到 Javascript 字节数组互操作

javascript - JS reduce - 仅对对象中的数组长度求和

ios - Swift 2.1 初始化字符串数组的新方法?

C - 将文本中的值存储到数组中