如何在C中旋转1d数组的一部分?
我打印出一个6×6 1darrays,但想要逆时针旋转左上角3×3部分。 有算法吗? 将来我也想像右下3×3部分或右上3×3部分或左下3×3部分一样旋转。
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]
在这里,重要的是要区分内存中的内容分配方式以及代表它们的方式。 没有“6×6 1Darrays”这样的东西,因为1Darrays没有行和列。 因此,首先将此1Darrays转换为2Darrays6x6。
然后,您可以通过指定坐标(x,y)来定义旋转中心。 你应该理智地检查这些坐标,使它们不在矩阵的边缘(或者,设计算法,以便在需要时这是可能的)。
直截了当的解决方案就是抓住中心周围的指数并以硬编码的方式移动数据:
array[center_x-1][center_y-1] = array[center_x][center_y-1]; ...
等等。 这将是最快的方式,最简单的解决方案通常是最好的解决方案。
允许可变旋转方向的更模块化的方法是创建指向需要旋转的中心周围的数据的指针arrays。 这个指针数组可以实现为链表的简单forms:
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”是中心。
有了这个,你可以简单地在任何方向迭代链表,并将数据从一个节点移动到另一个节点。 它比直接arrays访问更灵活,但速度更慢,更复杂。 它可以扩展到支持各种野生旋转模式。