旋转阵列顺时针
说我有多维数组是这样的:旋转阵列顺时针
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]);
这没有正确旋转。它留下了一些值,并将其他人放在错误的地方。
我在做什么错,我该如何做到这一点?
您不需要八次交换来旋转矩阵,因为最后两次交换将两个项目放在他们的位置。额外的掉期将他们的操作数再次置于错误的位置。
中心项目留在它的位置。前四次互换在他们的新地点放置了四件物品;最后两对互相交换新的位置,所以只有两次交换足以完成轮换。
swap(&arr[0][0], &arr[2][0]);
swap(&arr[0][1], &arr[1][0]);
swap(&arr[0][2], &arr[2][0]);
swap(&arr[1][0], &arr[2][1]);
swap(&arr[1][2], &arr[2][1]);
swap(&arr[2][2], &arr[2][0]);
谢谢!出于好奇,我会如何逆时针旋转它,只是将代码逆转? – DEADBEEF
您可以在每行代码上交换数组索引;例如[2] [0]会变成[0] [2]。 [在线试用!(https://tio.run/##hVHbToQwFHym[email protected]nfI9Xo9tXtR3n28M7Lsuchx/[email protected][email protected]zWhmnrSoHD3j8qZpQ[email protected]@[email protected]9ltq3J1XBpx87DL8 “C(GCC) - 在线试用”) – musicman523
@heythere奇怪的是,最后两条线是相同的。前四个做改变,从对面挑选物品。这是[修改的演示](http://ideone.com/uQLKpu)。 – dasblinkenlight
您可能会注意到,旋转后,旋转阵列的第一行的元素来自原数组的第一列,按相反的顺序相对于指数。同样,旋转数组的第二行来自原始数组的第二列,依此类推。考虑到这一点,可以在将新值复制到原始数组之前,编写一个函数,使用原始数组中的适当值填充新数组。
函数rotate_array()
遍历数组rotated
。 i
第rotated
行的元素来自输入数组a
的i
列。 i
第rotated
行的j
th元素是a
的i
第012列的n-j-1
th元素。然后使用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
@DavidBowling固定。 – DEADBEEF
类似[问题](https://*.com/questions/40832947/array-rotation-in-c/) – BLUEPIXY
什么是'swap'?你应该显示你的代码,并且最好发布一个[MCVE](http://*.com/help/mcve) –