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

給定一個row行col列的整數數組array,要求從array[0][0]元素開始,按回形從外向內順時針順序遍歷整個數組。如圖所示:數組
思路:這題和codevs中的有一題「蛇形矩陣」很是相似:http://codevs.cn/problem/1160/測試
能夠選用差很少同樣的思路解題。我是按照矩陣從外而內一層一層輸出(若是你願意一層一層地剝開個人心~咳咳),具體過程以下圖(7*8的矩陣):spa
從a[0][0]開始輸出,用一個flag來計當前所到達的層數(從外往內,最外面是第一層),再用一個temp來控制循環的次數(temp=m*n),每次輸出一個數字,temp就減1,每次輸出後判斷temp是否等於0,若是等於就結束程序,不然繼續循環,這樣就能夠有效控制循環的次數code
我用了四個for分別輸出這一個框的上、右、下、左邊,如上圖所示:blog
上邊的起點爲a[0][0],終點爲a[0][6];ip
右邊的起點爲a[0][7],終點爲a[5][7];get
下邊的起點爲a[6][7],終點爲a[6][0];input
左邊的起點爲a[5][0],終點爲a[1][0],這樣咱們就能夠循環完一個框了,那麼該如何控制起點和終點呢?it
不妨稍加觀察,每個起點終點的i、j值都是有規律的可循的(便可以用式子表示出來),因此我纔在這裏加了個flag方便運算,經過觀察:io
上邊的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 }