C语言 · 回形取数

基础练习 回形取数  
时间限制:1.0s   内存限制:512.0MB
      
问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
 
 1 #include<stdio.h> 
 2 int main(){
 3     int m,n;
 4     scanf("%d%d",&m,&n);
 5     int a[m][n];
 6     //输入矩阵 
 7     for(int i=0;i<m;i++){
 8         for(int j=0;j<n;j++){
 9             scanf("%d",&a[i][j]);
10         }
11     }
12     int sum=m*n;//矩阵中数的总数 
13     int i,j;
14     i=-1;
15     j=0;
16     while(sum){
17         //首先向下走:列数不变,行数+1
18         //终止条件:无路可走或已经取过 
19         while(a[++i][j]!=-1 && i<m){
20             printf("%d ",a[i][j]);//输出取到的数 
21             a[i][j]=-1;//取过后将该位置值置为-1
22             sum--;//每取出一个数,总数减1 
23         }
24         i--;//回到当前行,因为前面的++i,让i大了一个 
25         
26         //向下走不通了左转就向右走:行数不变,列数+1 
27         while(a[i][++j]!=-1 && j<n){
28             printf("%d ",a[i][j]);
29             a[i][j]=-1;
30             sum--; 
31         }
32         j--;//回到当前列,因为前面的++j,让j大了一个 
33         
34         //向右走不通了左转就向上走 : 列数不变,行数-1
35         //终止条件:无路可走或已经取过
36         while(a[--i][j]!=-1 && i>=0){  
37             printf("%d ",a[i][j]);//输出取到的数
38             a[i][j]=-1;//取过后将该位置值置为-1 
39             sum--;//每取出一个数,总数减1 
40         }  
41         i++;//回到当前行,因为前面的--i,让i小了一个
42         
43         //向上走不通了左转就向左走:行数不变,列数-1
44         while(a[i][--j]!=-1 && j>=0){  
45             printf("%d ",a[i][j]);
46             a[i][j]=-1;  
47             sum--;  
48         }  
49         j++;//回到当前列,因为前面的--j,让j小了一个
50     }
51 }
原文地址:https://www.cnblogs.com/panweiwei/p/6527325.html