我需要为Pascal写一个程序,让数组变成这样的螺旋形式:
(7) (8) (9) (10)
(6) (1) (2) (11)
(5) (4) (3) (12)
(16)(15)(14)(13)从1开始一直到36,但这并不重要。
经过三天的思考,我不知道如何实现这一点。
问题不在于语言语法或数组,而在于算法。
你能帮助我在任何编程语言的想法,链接,伪代码或程序代码?
发布于 2010-11-06 04:49:23
考虑将nxn矩阵拆分成2x2,4x4,…的同心子矩阵nxn。在您的例子中,我们将有外部的子矩阵(元素5到16)和内部的子矩阵(元素1到4)。
现在,对于每个级别,您应该遍历四个边,并用所需的元素填充它们。你可以由内而外或由外而内。我要从外到里。我们保留一个计数器,它最初是n*n (在我们的例子中是16)。
对于从1到n/2的i
首先取下边缘( 16-13号元素为外层)。我们从x[n-i+1][i]转到x[n-i+1][n-i+1],然后填充(第一层是16,15,14,13,第二层是4,3 )
然后我们取右边缘(元素12-10表示外层)。我们从x[n-i][n-i+1]到x[i][n-i+1] (外层元素12,11,10 )。
然后我们取上边缘(元素9-7表示外层)。我们从x[i][n-i]到x[i][i] (元素9,8,7表示外层)
最后我们取左边缘(元素6-5表示外层)。我们从x[i+1][i]转到x[n-i][i]并填充这一侧(外层为6,5)。
最后,如果n是奇数,你就有了中间元素。然后,您所要做的就是将x[n/2+1][n/2+1] = 1
我希望我把意思说清楚了;如果有什么你不明白的,可以问。
另外,我没有实现这个解决方案,因为我假设您的问题只是想法,而不是实现
发布于 2010-11-06 06:54:59
在迭代矩阵时,有一个很好的想法可以用来改变方向。请看下表。Input (dX,dY)是增量值的前一个方向,output (cwdx,cwdy)是下一个时钟方向,output (ccwdx,ccwdy)是下一个逆时针方向(坐标(0,0)在左上角):
dx dy | cwdx cwdy | ccwdx ccwdy
-------------------------------
1 0 | 0 1 | 0 -1
0 1 | -1 0 | 1 0
-1 0 | 0 -1 | 0 1
0 -1 | 1 0 | -1 0因此,给定方向(dx,dy),顺时针旋转需要方向(-dy,dx),逆时针旋转需要方向(dx,-dy)。这意味着您不需要在代码中使用开关来转向,只需通过三行代码即可完成:
temp = dx; // this is for clockwise turn
dx = -dy;
dy = temp;还有一个小把戏。要填充矩阵,你实际上可以从结束和最大数字开始,然后到达中心和数字1。如果你从边缘开始并到达中心,那么你可以在一行中填充数字,直到你到达矩阵的边缘或另一个数字。如果因为(x+dx,y+dy)不是“可填充的”而不能再填充当前方向,那么改变方向。
发布于 2010-11-06 07:04:42
最简单的想法是从螺旋的末端开始,然后回到原来的位置。
有四个变量(left、top、right、bottom),它们告诉您从每一端适当地填充了多少。
制作一个大小合适的矩阵。
将left = top = 0、right和bottom初始化为最后一个列和行索引。
left -> right中的bottom行。将bottom减一。right from bottom -> top。将right减一。top from right -> left。将top增加一。left from top -> bottom。将left加1。https://stackoverflow.com/questions/4109836
复制相似问题