输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
注意:分析每一步打印的前提条件。第一步总是需要的,因为打印一圈至少有一步。如果只有一行,那就不用第二步了。也就是需要第二步的前提条件是终止行号大于起始行号。需要第三步打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于外,还要求终止列号大于起止列号。同理,需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起止列号。
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
class
Solution
{ public : void PrintCircle(vector<vector< int > > &matrixmatrix, int clos, int rows, int start, vector< int > &res) { int endX = clos - 1 - start; int endY = rows - 1 - start;
//从左到右打印第一行
for ( int i = start; i <= endX; i++) { int number = matrixmatrix[start][i]; res.push_back(number); }
//从上到下打印一列
if (start < endY) { for ( int i = start + 1 ; i <= endY; ++i) { int number = matrixmatrix[i][endX]; res.push_back(number); } }
//从右到左打印一行
if (start < endX && start < endY) { for ( int i = endX - 1 ; i >= start; --i) { int number = matrixmatrix[endY][i]; res.push_back(number); } }
//从下到上打印一列 if (start < endX && start < endY - 1 ) { for ( int i = endY - 1 ; i >= start + 1 ; --i) { int number = matrixmatrix[i][start]; res.push_back(number); } } } vector< int > printMatrix(vector<vector< int > > matrix) { int rows = matrix.size();//行数 int clos = matrix[ 0 ].size();//列数 vector< int > res; if (matrix.size() == 0 || clos == 0 || rows == 0 ) return res; int start = 0 ; while (clos > start * 2 && rows > start * 2 )//让循环继续的条件 { PrintCircle(matrix, clos, rows, start, res); ++start; } return res; } }; |