輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 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,同時終止列號大於起止列號。
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; } }; |