首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有关螺旋矩阵的帮助

有关螺旋矩阵的帮助
EN

Stack Overflow用户
提问于 2010-11-06 04:35:16
回答 10查看 7.7K关注 0票数 3

我需要为Pascal写一个程序,让数组变成这样的螺旋形式:

代码语言:javascript
复制
(7) (8) (9) (10)
(6) (1) (2) (11)
(5) (4) (3) (12)
(16)(15)(14)(13)

从1开始一直到36,但这并不重要。

经过三天的思考,我不知道如何实现这一点。

问题不在于语言语法或数组,而在于算法。

你能帮助我在任何编程语言的想法,链接,伪代码或程序代码?

EN

回答 10

Stack Overflow用户

发布于 2010-11-06 04:49:23

考虑将nxn矩阵拆分成2x2,4x4,…的同心子矩阵nxn。在您的例子中,我们将有外部的子矩阵(元素5到16)和内部的子矩阵(元素1到4)。

现在,对于每个级别,您应该遍历四个边,并用所需的元素填充它们。你可以由内而外或由外而内。我要从外到里。我们保留一个计数器,它最初是n*n (在我们的例子中是16)。

对于从1n/2i

首先取下边缘( 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

我希望我把意思说清楚了;如果有什么你不明白的,可以问。

另外,我没有实现这个解决方案,因为我假设您的问题只是想法,而不是实现

票数 1
EN

Stack Overflow用户

发布于 2010-11-06 06:54:59

在迭代矩阵时,有一个很好的想法可以用来改变方向。请看下表。Input (dX,dY)是增量值的前一个方向,output (cwdx,cwdy)是下一个时钟方向,output (ccwdx,ccwdy)是下一个逆时针方向(坐标(0,0)在左上角):

代码语言:javascript
复制
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)。这意味着您不需要在代码中使用开关来转向,只需通过三行代码即可完成:

代码语言:javascript
复制
temp = dx; // this is for clockwise turn
dx = -dy;
dy = temp;

还有一个小把戏。要填充矩阵,你实际上可以从结束和最大数字开始,然后到达中心和数字1。如果你从边缘开始并到达中心,那么你可以在一行中填充数字,直到你到达矩阵的边缘或另一个数字。如果因为(x+dx,y+dy)不是“可填充的”而不能再填充当前方向,那么改变方向。

票数 1
EN

Stack Overflow用户

发布于 2010-11-06 07:04:42

最简单的想法是从螺旋的末端开始,然后回到原来的位置。

有四个变量(lefttoprightbottom),它们告诉您从每一端适当地填充了多少。

制作一个大小合适的矩阵。

left = top = 0rightbottom初始化为最后一个列和行索引。

  • 填充left -> right中的bottom行。将bottom减一。
  • Fill right from bottom -> top。将right减一。
  • Fill top from right -> left。将top增加一。
  • Fill left from top -> bottom。将left加1。
  • 迭代,直到填满整个矩阵。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4109836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档