Openjudge-NOI题库-二维数组回形遍历
题目描述 Description
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示:
输入输出格式 Input/output
输入格式:
输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出格式:
按遍历顺序输出每个整数。每个整数占一行。
输入的第一行上有两个整数,依次为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 }
我不怕千万人阻挡,只怕自己投降…