給定一個row行col列的整數數組array,要求從array[0][0]元素開始,按回形從外向內順時針順序遍歷整個數組。如圖所示:

輸入的第一行上有兩個整數,依次為row和col。
余下有row行,每行包含col個整數,構成一個二維整數數組。
(注:輸入的row和col保證0 < row < 100, 0 < col < 100)
輸出格式:
按遍歷順序輸出每個整數。每個整數占一行。
思路:這題和codevs中的有一題“蛇形矩陣”非常類似:http://codevs.cn/problem/1160/
可以選用差不多一樣的思路解題。我是按照矩陣從外而內一層一層輸出(如果你願意一層一層地剝開我的心~咳咳),具體過程如下圖(7*8的矩陣):
從a[0][0]開始輸出,用一個flag來計當前所到達的層數(從外往內,最外面是第一層),再用一個temp來控制循環的次數(temp=m*n),每次輸出一個數字,temp就減1,每次輸出后判斷temp是否等於0,如果等於就結束程序,否則繼續循環,這樣就可以有效控制循環的次數
我用了四個for分別輸出這一個框的上、右、下、左邊,如上圖所示:
上邊的起點為a[0][0],終點為a[0][6];
右邊的起點為a[0][7],終點為a[5][7];
下邊的起點為a[6][7],終點為a[6][0];
左邊的起點為a[5][0],終點為a[1][0],這樣我們就可以循環完一個框了,那么該如何控制起點和終點呢?
不妨稍加觀察,每一個起點終點的i、j值都是有規律的可循的(即可以用式子表示出來),所以我才在這里加了個flag方便運算,通過觀察:
上邊的j起點表示為:flag-1,終點表示為:n-flag-1;
右邊的i起點表示為:flag-1,終點表示為:m-flag;
下邊的j起點表示為:flag-1,終點表示為:n-flag-1;
左邊的i起點表示為:flag,終點表示為:m-flag-1;
這些規律如上圖所示,通過這些規律就可以輕松地把代碼寫出來了!
代碼如下:
1 #include <stdio.h> 2 int main() 3 { 4 int m,n; 5 int i,j; 6 int temp; 7 int a[101][101]; 8 int flag=1;//層數(最外層為0層) 9 scanf("%d%d",&m,&n); 10 temp=m*n; 11 for(i=0;i<m;i++) 12 { 13 for(j=0;j<n;j++) 14 { 15 scanf("%d",&a[i][j]); 16 } 17 } 18 /*================================*///從外往內一層一層輸出 19 while(1) 20 { 21 for(j=flag-1;j<=n-flag-1;j++)//上 22 { 23 printf("%d\n",a[flag-1][j]); 24 temp--; 25 if(temp==0) return 0; 26 } 27 for(i=flag-1;i<=m-flag;i++)//右 28 { 29 printf("%d\n",a[i][n-flag]); 30 temp--; 31 if(temp==0) return 0; 32 } 33 for(j=n-flag-1;j>=flag-1;j--)//下 34 { 35 printf("%d\n",a[m-flag][j]); 36 temp--; 37 if(temp==0) return 0; 38 } 39 for(i=m-flag-1;i>=flag;i--)//左 40 { 41 printf("%d\n",a[i][flag-1]); 42 temp--; 43 if(temp==0) return 0; 44 } 45 flag++; 46 } 47 }