假设我有这样的多维数组:
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
的第 imemcpy()
函数将旋转数组的内容复制到原始数组中。
#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/