假设我有这样的多维数组:
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]);
这不能正确旋转。它留下了一些价值,并将其他人放在错误的地方。
我做错了什么,我怎么能做到这一点?
答案 0 :(得分:3)
您可能会注意到,旋转后,旋转数组的第一行的元素来自原始数组的第一列,与索引的顺序相反。类似地,旋转数组的第二行来自原始数组的第二列,依此类推。考虑到这一点,您可以编写一个函数,在将新值复制到原始数组之前,使用原始数组中的适当值填充新数组。
函数rotate_array()
遍历数组rotated
。第i
行rotated
的元素来自输入数组i
的{{1}}列。第a
行j
的{{1}}元素是i
rotated
列的n-j-1
元素。然后使用i
函数将旋转数组的内容复制到原始数组中。
a
memcpy()
答案 1 :(得分:2)
您不需要八次交换来旋转矩阵,因为最后两次交换将两个项目放在他们的位置。额外的互换将他们的操作数再次置于错误的位置。
中心项目留在原位。前四个掉期在他们的新位置放置了四个项目;最后两对正在取得彼此的新位置,因此只有两次交换就足以完成轮换。
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]);