Openjudge-NOI題庫-二維數組回形遍歷

題目描述 Description

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

 輸入輸出格式 Input/output
輸入格式:
輸入的第一行上有兩個整數,依次爲row和col。
餘下有row行,每行包含col個整數,構成一個二維整數數組。
(注:輸入的row和col保證0 < row < 100, 0 < col < 100)
輸出格式:
按遍歷順序輸出每一個整數。每一個整數佔一行。
 輸入輸出樣例 Sample input/output
樣例測試點#1
輸入樣例:
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

思路:這題和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 }
相關文章
相關標籤/搜索