试题 基础练习 回形取数
资源限制
时间限制: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
#include <stdio.h> void anticlockwise(int A[][200], int m, int n); int main() { int m,n,i,j; int A[200][200]; scanf("%d %d",&m,&n); for(i=0; i<m; i++) { for(j=0; j<n; j++) { scanf("%d",&A[i][j]); } } anticlockwise(A,m,n); return 0; } void anticlockwise(int A[][200],int m,int n)//注意二维数组传参的问题,可以给列先设定一个可以满足的最大,这样比较方便 { //先初始化左上角和右下角的坐标 int leftUphang=0,leftUplie=0,rightDownhang=m-1,rightDownlie=n-1; // int h=leftUphang,l=leftUplie;//复制一遍,为了使初始的左上角左边不变,因为在循环的时候,到内层了就不是和0在比较,而是在和左上角那个点在比较,所以需要复制一遍 //最后一步要进行的就是循环,可以知道通过左上角不断的向下,右上角的行列++,会有重复的时候,所以会在打印出了一圈之后将左上的--,右下的++ while(leftUphang<=rightDownhang &&leftUplie<=rightDownlie) { int l=leftUplie; int h=leftUphang;//新一轮的循环记得将新的左上角赋值给l和j ,所以放在里面 //既然是逆时针 //先输出左边的一列,列不变,行++ while(h<=rightDownhang) { printf("%d ",A[h++][l]); } //再输出下面的一排,行不变,列++ //行恢复 h=rightDownhang; //列向右移动 if(n==1) { return; } l++; while(l<=rightDownlie) { printf("%d ",A[h][l++]); } //再输出右边的一列,列不变,行++ //恢复 l=rightDownlie; //行-- h--; if(m==1){ return; } while(h>=leftUphang) { printf("%d ",A[h--][l]); } //最后输出上边的一排,行不变,列-- //恢复 h=leftUphang; //列移动 l--; while(l>leftUplie) { printf("%d ",A[h][l--]); } leftUphang++; leftUplie++; rightDownhang--; rightDownlie--; } }
以上代码,大致思路是对的,只不过对于特定是一些情况的时候仍然需要讨论一下才行,比如只有一行,或者只有一列的情况就需要设置退出条件