23:二維陣列回形遍歷
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65536kB
- 描述
-
給定一個row行col列的整數陣列array,要求從array[0][0]元素開始,按回形從外向內順時針順序遍歷整個陣列。如圖所示:
- 輸入
- 輸入的第一行上有兩個整數,依次為row和col。
餘下有row行,每行包含col個整數,構成一個二維整數陣列。
(注:輸入的row和col保證0 < row < 100, 0 < col < 100) - 輸出
- 按遍歷順序輸出每個整數。每個整數佔一行。
- 樣例輸入
-
4 4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
- 樣例輸出
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- 來源
- 北京大學2009年醫學部練習題
- 這道題的關鍵,在於
- 1.如何找到四個方向
- 2.四個方向分別應該怎麼走
- 3.方向轉換的判斷條件
-
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 int a[10001][10001]; 7 int b[10001][10001]; 8 int now=4;// 1上 2下 3左 4右 9 int tot=1; 10 int main() 11 { 12 int n,m; 13 cin>>n>>m; 14 int i=1,j=1; 15 for(int i=1;i<=n;i++) 16 { 17 for(int j=1;j<=m;j++) 18 { 19 cin>>a[i][j]; 20 } 21 } 22 cout<<a[1][1]<<endl; 23 b[1][1]=1; 24 while(tot!=n*m) 25 { 26 if((j==m&&now==4)||(b[i][j+1]==1&&now==4)) 27 now=2;//下 28 if((i==n&&now==2)||(b[i+1][j]==1&&now==2)) 29 now=3;//左 30 if((j==1&&now==3)||(b[i][j-1]==1&&now==3)) 31 now=1;//上 32 if(b[i-1][j]==1&&now==1) 33 now=4;//右 34 if(now==1) 35 { 36 cout<<a[i-1][j]<<endl; 37 b[i-1][j]=1; 38 i--; 39 tot++; 40 }//上 41 if(now==2) 42 { 43 cout<<a[i+1][j]<<endl; 44 b[i+1][j]=1; 45 tot++; 46 i++; 47 }//下 48 if(now==3) 49 { 50 cout<<a[i][j-1]<<endl; 51 b[i][j-1]=1; 52 tot++; 53 j--; 54 }//左 55 if(now==4) 56 { 57 cout<<a[i][j+1]<<endl; 58 b[i][j+1]=1; 59 tot++; 60 j++; 61 }//右 62 } 63 64 return 0; 65 }