这里有一个简单的解决方案:
保持与您的数组大小相同(所有单元格初始化为0)的二维数组(checkIfVisited),以便跟踪已访问的单元格。如果(i,j) 是1 则表示原始单元格已经被访问过。
我们在dir 变量的帮助下螺旋式迭代整个数组,该变量跟踪我们当前正在遍历的方向。
dir = 0 表示向下移动,1 表示向右移动,2 表示向上移动,3 表示向左移动。
-
当i 和j 超出限制,或者通过从checkIfVisited 数组中查找之前已经遍历过下一个要遍历的单元格时,我们会改变方向。
我对上述算法有一个简单的 C++ 实现:
#include <iostream>
using namespace std;
int main()
{
int arr[5][5] = {10, 11, 12, 13, 14,
15, 16, 17, 18, 19,
20, 21, 22, 23, 24,
25, 26, 27, 28, 29,
30, 31, 32, 33, 34};
int checkIfVisited[5][5] = {0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0};
int i,j,dir,countVisited;
dir = 0;
countVisited = 0;
i = 0;
j = 0;
while(countVisited<5*5)
{
cout<<arr[i][j]<<" ";
checkIfVisited[i][j]=1;
if(dir==0)
{
countVisited++;
if(i+1>4 || checkIfVisited[i+1][j]==1){
dir=1;
j++;
}
else
i++;
}
else if(dir==1)
{
countVisited++;
if(j+1>4 || checkIfVisited[i][j+1]==1){
dir=2;
i--;
}
else
j++;
}
else if(dir==2)
{
countVisited++;
if(i-1<0 || checkIfVisited[i-1][j]==1){
dir=3;
j--;
}
else
i--;
}
else
{
countVisited++;
if(j-1<0 || checkIfVisited[i][j-1]==1){
dir=0;
i++;
}
else
j--;
}
}
return 0;
}
输出: 10 15 20 25 30 31 32 33 34 29 24 19 14 13 12 11 16 21 26 27 28 23 18 17 22