题目:输入一个矩阵,按照从外到里以顺时针顺序依次打印每一个数字
例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。
分析:突破点就是先要画图,如下图
每次打印一个圈,接下来下一圈的左上角坐标点为起点再打印。
其中需要考虑在打印每一圈的时候一些情况:
上面是打印每一圈的时候,要考虑是否需要四周全部要打印呢?具体在代码里面体现了。
void printMatrixClockwisely(int **numbers,int rows,int columns ) { if(numbers==NULL||rows<=0||columns<=0) return ; //打印的终止条件,本题的核心,每个圆圈的起点就是左上角的点,所以主要是对这个点进行判断 //能循环打印的条件是最里面一圈的起点(也就是这个圈左上角的点)*<rows&&<columns int start=0; while((rows>2*start)&&(columns>2*start)) { //每次while打印一个圈 printACircle(numbers,rows,columns,start); start++; //start++ 就是进行下一个圆圈 } } void printACircle(int **numbers,int rows,int columns,int start) { int endX=columns-1-start; int endY=rows-1-start; //先遍历上行 if(start<=endX) { for (int i=start;i<=endX;i++) cout<<numbers[start][i]<<" "; } //遍历右列 if (start<endY) { for(int i=start;i<=endY;i++) cout<<numbers[i][endX]<<" "; } //遍历下行 if (start<endX&&start<endY) { for(int i=endX-1;i>=start;i--) cout<<numbers[endY][i]<<" "; } //遍历左列 if (start+1<endY&&start<endX) { for(int i=endY-1;i>=start-1;i--) cout<<numbers[i][start]<<" "; } }