回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入第一行是两个均不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
3 3
1 2 3
4 5 6
7 8 9
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 }
这个还算简洁吧,顺时针逆时针都可以,起点也可以选,以后这样的题就这样写了
原文:https://www.cnblogs.com/fate-/p/12266740.html