#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--; } }
以上代码,大致思路是对的,只不过对于特定是一些情况的时候仍然需要讨论一下才行,比如只有一行,或者只有一列的情况就需要设置退出条件
原文:https://www.cnblogs.com/jessie99/p/12400402.html