我想要做的是一种算法,该算法以闭合螺旋模式通过矩阵,如下所示:
1 | 2 | 3
---------
8 | 9 | 4
---------
7 | 6 | 5
解决这个问题最简单的方法是什么?
我的想法:
P.S:不确定如何处理大小不是正方形或宽度是偶数的情况。
答案 0 :(得分:5)
您不需要每个单元格的访问概念,只需要一个变量来指示您的位置。
下面是一些(未经过广泛测试的)Java代码。
它应该是非常易读的。
// initialize
int w = 5, h = 7;
int[][] arr = new int[w][h];
// do the work
int count = 1;
for (int i = 0; count <= w*h; i++)
{
// go right
for (int x = i; x < w-i && count <= w*h; x++)
arr[x][i] = count++;
// go down
for (int y = i+1; y < h-i && count <= w*h; y++)
arr[w-i-1][y] = count++;
// go left
for (int x = w-2-i; x >= i && count <= w*h; x--)
arr[x][h-i-1] = count++;
// go up
for (int y = h-2-i; y > i && count <= w*h; y--)
arr[i][y] = count++;
}
输出:
1 2 3 4 5
20 21 22 23 6
19 32 33 24 7
18 31 34 25 8
17 30 35 26 9
16 29 28 27 10
15 14 13 12 11
答案 1 :(得分:1)
对于每个单元格,有一个数字表示在其直接的垂直和水平位置有多少空/访问的单元格(让我们称之为numVisitedAroundCell
。)此外,还有一个布尔标志isVisited
。浏览单元格并更新numVisitedAroundCell
(因此角落单元格将为numVisitedAroundCell == 2
,而非角落的单元格外层将具有numVisitedAroundCell == 1
)
浏览单元格并找到一个角单元格,这是一个numVisitedAroundCell == 2
的单元格。
从那里,纵向或横向移动,同时将您传递的每个单元格标记为isVisited
并增加numVisitedAroundCell
的数量。沿着您选择的路径前进,直到您到达角落单元格(当您到达角落单元格时,numVisitedAroundCell
应为3),然后找到下一个未访问的单元格,然后沿着该路线前进。如果你继续这样做,我相信你会得到你想要的螺旋。此外,这应该处理宽度均匀且尺寸不是正方形的情况。
答案 2 :(得分:1)
递归地,没有充分理由:
使用名为right()
,down()
,left()
和up()
的四个函数。
right()
函数沿矩阵的顶行计算,然后
传递剩余的行(所有行除了刚刚填充的行)
down()
。
down()
函数向下计算矩阵的右边缘,然后
将剩余的列传递给left()
。
等
当宽度或高度达到零时,递归停止。