面试题20:顺时针打印矩阵递归和非递归两种方式实现
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
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。
#include "stdafx.h" //方法一:递归方式;顺时针循环打印,一圈一圈的打印,先右,再下,再左,再上;打完一圈再打内圈,当不符合条件时,结束。 //参数:matrix:二维矩阵;columns:矩阵的列数;rows:矩阵的行数;start:一圈开始的左上角的坐标值(x、y坐标是相同的,例如5X5,第一圈左上角(start,start)即为(0,0)...) void PrintMatrixRecursive(int matrix[][4],int columns,int rows,int start=0) { if (!matrix||columns<1||rows<1) { return; } //递归终止条件 if (columns<=2*start||rows<=2*start) { return; } int stopx=columns-1-start;//一圈最右列在坐标中的位置 int stopy=rows-1-start;//一圈最大行在坐标中位置 //打印此圈中的最上行 for (int i=start;i<=stopx;i++) { printf("%d ",matrix[start][i]); } //打印此圈中的最右列 if (start<stopx)//如果此圈中不止有一列 { for (int i=start+1;i<=stopy;i++) { printf("%d ",matrix[i][stopx]); } } //打印次圈中的最下行 if (start<stopx&&start<stopy) { for (int i=stopx-1;i>=start;i--) { printf("%d ",matrix[stopy][i]); } } //打印次圈中的最左行 if (start<stopx&&start<stopy-1) { for (int i=stopy-1;i>=start+1;i--) { printf("%d ",matrix[i][start]); } } PrintMatrixRecursive(matrix,columns,rows,start+1);//递归调用打印下一圈 } //非递归方式,其主要思想和递归相同,只是增加循环判断打印函数的退出条件 void PrintMatrix(int matrix[][4],int columns,int rows,int start);//打印矩阵单圈的函数声明 void PrintMatrixCircle(int matrix[][4],int columns,int rows) { if (!matrix||columns<1||rows<1) { return; } int start=0; while(columns>start*2&&rows>start*2) { PrintMatrix(matrix,columns,rows,start); ++start; } } //打印矩阵单圈的函数 void PrintMatrix(int matrix[][4],int columns,int rows,int start) { int stopx=columns-1-start;//一圈最右列在坐标中的位置 int stopy=rows-1-start;//一圈最大行在坐标中位置 //打印此圈中的最上行 for (int i=start;i<=stopx;i++) { printf("%d ",matrix[start][i]); } //打印此圈中的最右列 if (start<stopx)//如果此圈中不止有一列 { for (int i=start+1;i<=stopy;i++) { printf("%d ",matrix[i][stopx]); } } //打印次圈中的最下行 if (start<stopx&&start<stopy) { for (int i=stopx-1;i>=start;i--) { printf("%d ",matrix[stopy][i]); } } //打印次圈中的最左行 if (start<stopx&&start<stopy-1) { for (int i=stopy-1;i>=start+1;i--) { printf("%d ",matrix[i][start]); } } } //简单测试,打印5x4矩阵 int main() { int matrix[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}}; printf("递归方式实现: "); PrintMatrixRecursive(matrix,4,5); printf("\n非递归方式实现:"); PrintMatrixCircle(matrix,4,5); printf("\n"); return 0; }
“过一个平凡无趣的人生实在太容易了,你可以不读书,不冒险,不运动,不写作,不外出,不折腾……但是,人生最后悔的事情就是:我本可以。”——陈素封。