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 }

 

posted @ 2016-07-16 21:19  Memoryヾノ战心  阅读(4571)  评论(2编辑  收藏  举报