[蓝桥杯][基础训练]回形取数

Description

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。

Input

输入第一行是两个均不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。

Output

输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

Sample Input

3 3
1 2 3
4 5 6
7 8 9

Sample Output

1 4 7 8 9 6 3 2 5



 1 #include<stdio.h>
 2 int book[201][201];//用来标记走过的路 
 3 int main(){
 4     int dir[4][2]={1,0,0,1,-1,0,0,-1};//用于转向的数组 
 5     int n,m;//行,列 
 6     int map[201][201];//存储地图信息 
 7     int dx=0,dy=1;//出发点 
 8     int k=0;//与转向数组一起用 
 9     scanf("%d%d",&n,&m);
10     int num=n*m,sum=0;//num表示一共要输出这么多的数
11                       //sum表示当前一共输出了多少数 
12     for(int i=1;i<=n;i++){
13         for(int j=1;j<=m;j++){
14             scanf("%d",&map[i][j]);
15         }
16     }
17     while(1){//一直进行,输出数字的量达到num才停止 
18         dx+=dir[k%4][0];//开始走 
19         dy+=dir[k%4][1];
20         if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!book[dx][dy]){
21         //如果还在地图里,并且这里没有走过 
22             printf("%d",map[dx][dy]);//就输出这里的数 
23             sum++;//输出数量加一 
24             if(sum==num)//达到数的总量后,跳出循环 
25                 break;
26             else    //如果没达到总量
27             printf(" "); //就输出空格
28                 //因为最后一个数字后不能加空格,所以这样输出空格 
29             book[dx][dy]=1;//输出后标记 
30         }
31         else{//如果dxdy不符合条件了 
32             dx-=dir[k%4][0];//就退回原来的地方 
33             dy-=dir[k%4][1];
34             k++;//k自增,这时转向数组发挥作用,开始转向 
35         }
36     }
37     return 0;
38 }

 



这个还算简洁吧,顺时针逆时针都可以,起点也可以选,以后这样的题就这样写了

posted @ 2020-02-05 21:31  ice--cream  阅读(538)  评论(0编辑  收藏  举报