如何在C中旋转1d数组的一部分?

时间:2017-02-23 07:16:20

标签: c arrays rotation computer-science

我打印出一个6x6 1d阵列,但想要逆时针旋转左上角3x3部分。有算法吗?将来我也想像右下3x3部分或右上3x3部分或左下3x3部分一样旋转。

a[0]  a[1]  a[2]  a[3]  a[4]  a[5]         a[1]  a[2]  a[8]  a[3]  a[4]  a[5]
a[6]  a[7]  a[8]  a[9]  a[10] a[11]        a[0]  a[7]  a[14] a[9]  a[10] a[11]
a[12] a[13] a[14] a[15] a[16] a[17]  --->  a[6]  a[12] a[13] a[18] a[19] a[20]
a[18] a[19] a[20] a[21] a[22] a[23]        a[18] a[19] a[20] a[21] a[22] a[23]
a[24] a[25] a[26] a[27] a[28] a[29]        a[24] a[25] a[26] a[27] a[28] a[29]
a[30] a[31] a[32] a[33] a[34] a[35]        a[30] a[31] a[32] a[33] a[34] a[35]

1 个答案:

答案 0 :(得分:1)

重要的是要区分内存中的内容分配方式以及代表方式。没有" 6x6 1D阵列",因为1D阵列没有行和列。因此,首先将此1D阵列转换为2D阵列6x6。

然后,您可以通过指定坐标(x,y)来定义旋转中心。你应该理智地检查这些坐标,使它们不在矩阵的边缘(或者,设计算法,以便在需要时可以这样做。)

直言不讳的解决方案是抓住中心周围的指数并以硬编码的方式移动数据:

array[center_x-1][center_y-1] = array[center_x][center_y-1];
...

等等。这将是最快的方式,最简单的解决方案往往是最好的解决方案。

允许可变旋转方向的更模块化方法是创建指向需要旋转的中心周围数据的指针数组。这个指针数组可以实现为一种简单形式的链表:

typedef struct rotate_node_t rotate_node_t;
typedef struct rotate_node_t
{
  rotate_node_t* next;
  rotate_node_t* prev;
  int* data;
} rotate_node_t;

您的rotate_node_t rotation [8]可以将其索引分配为:

0 1 2
7 c 3
6 5 4

其中" c"是中心。

有了这个,你可以简单地在任何方向迭代链表,并将数据从一个节点移动到另一个节点。它比直接阵列访问更灵活,但速度更慢,更复杂。它可以扩展到支持各种野生旋转模式。