23:二維陣列回形遍歷

自為風月馬前卒發表於2017-03-06

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 }

 

相關文章