首页 > 代码库 > C语言 · 回形取数
C语言 · 回形取数
基础练习 回形取数
时间限制:1.0s 内存限制:512.0MB
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
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 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 }
C语言 · 回形取数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。