這裏有一個簡單的解決問題的方法:
保持同樣大小的一個二維數組(checkIfVisited
)(初始化爲0
所有的細胞)的陣列,以保持跟蹤已經訪問過的單元格。如果(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
內存消耗/複雜度是否有限制? – techtrainer
對此有幫助嗎? http://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/。他們以O(mn)的複雜度來完成它。 – Michiel
沒有內存或運行時間限制,但僅限使用單個循環 –