我打印了一个 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]
在这里,区分事物在内存中的分配方式和表示方式非常重要。不存在“6x6 1D 数组”这样的东西,因为 1D 数组没有行和列。因此,首先将此一维数组转换为 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”是中心。
完成此操作后,您可以简单地以任意方向迭代链表并将数据从一个节点移动到另一个节点。它比直接数组访问更灵活,但速度更慢且更复杂。并且它可以扩展以支持各种疯狂的轮换模式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)