顺时针旋转阵列

时间:2017-06-12 23:56:54

标签: 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]);

这不能正确旋转。它留下了一些价值,并将其他人放在错误的地方。

我做错了什么,我怎么能做到这一点?

2 个答案:

答案 0 :(得分:3)

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

函数rotate_array()遍历数组rotated。第irotated的元素来自输入数组i的{​​{1}}列。第aj的{​​{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]);

Demo.