Algorithm 以更小的螺旋线穿过正方形矩阵

Algorithm 以更小的螺旋线穿过正方形矩阵,algorithm,language-agnostic,Algorithm,Language Agnostic,我想做的是一个算法,它以闭合螺旋模式遍历矩阵,如下所示: 1 | 2 | 3 --------- 8 | 9 | 4 --------- 7 | 6 | 5 解决这个问题最简单的方法是什么 我的想法: 拐角或障碍物检测 有一个程序化的方式垂直向下和反向向下 有一种检测元素是否已被访问的方法 附言:不知道如何处理大小不是正方形或宽度是偶数的情况。每个单元格不需要一个访问的概念,只需要一个变量来指示您的距离 下面是一些(未经过广泛测试的)Java代码 它应该是相当可读的 // initia

我想做的是一个算法,它以闭合螺旋模式遍历矩阵,如下所示:

1 | 2 | 3
---------
8 | 9 | 4
---------
7 | 6 | 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++;
  }

对于每个单元格,有一个数字表示有多少空的/访问过的单元格处于其垂直和水平位置(我们称之为
numVisitedAroundCell
),还有一个布尔标志
isVisited
。检查单元格并更新
numVisitedAroundCell
(因此角单元格将具有
numVisitedAroundCell==2
,非角单元格的外层将具有
numVisitedAroundCell==1

遍历单元格并找到一个角单元格,它将是
numVisitedAroundCell==2的单元格


从那里,可以垂直或水平移动,同时将通过的每个单元格标记为已访问,并增加
numVisitedAroundCell
的数量。继续沿着您选择的路径前进,直到您碰到一个角单元格(当您碰到这个角单元格时,
numVisitedAroundCell
应该是3),然后找到下一个未访问的单元格,然后沿着该路径前进。如果你继续这样做,我相信你会得到你想要的螺旋。此外,这还应处理宽度均匀且尺寸不是正方形的情况。

递归地,没有充分的理由:

使用四个函数,分别名为
right()
down()
left()
up()

right()
函数沿矩阵的顶行计数,然后 将剩余的行(不包括刚才填写的行)传递给
down()

down()
函数对矩阵的右边缘进行倒计时,然后 将剩余的列传递到
left()

等等

当宽度或高度达到零时,递归停止

  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