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的矩陣):

從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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM