题解 | #顺时针打印矩阵#
顺时针打印矩阵
https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
#include <vector> class Solution { //注意:给的矩阵不一定是方阵! public: vector<int> printMatrix(vector<vector<int> > matrix) { //matrix.size()行数;matrix[0].size()列数 int rows = matrix.size(); int cols = matrix[0].size(); vector<int> res; if (matrix[0].size() == 0 ) { return res; } if (matrix[0].size() == 1 && matrix.size() == 1) { res.push_back(matrix[0][0]); return res; } //flag:墙壁和记录路径 //1 1 1 1 1 matrix //1 0 0 0 1 1 2 3 //1 0 0 0 1 4 5 6 //1 0 0 0 1 7 8 9 //1 1 1 1 1 vector<vector<bool>>flag(rows + 2, vector<bool>(cols + 2, true)); for (int i = 1; i <= rows; i++) { for (int j = 1; j <= cols; j++) { flag[i][j] = false; } } int row = 0; int col = 0; while (true) { //right while (true) { if (flag[row + 1][col + 1] == false) res.push_back(matrix[row][col]); flag[row + 1][col + 1] = true; //check right side if (flag[row + 1][col + 2] == true) break; col++; } //down while (true) { if (flag[row + 1][col + 1] == false) res.push_back(matrix[row][col]); flag[row + 1][col + 1] = true; //check down side if (flag[row + 2][col + 1] == true) break; row++; } //left while (true) { if (flag[row + 1][col + 1] == false) res.push_back(matrix[row][col]); flag[row + 1][col + 1] = true; //check left side if (flag[row + 1][col] == true) break; col--; } //up while (true) { if (flag[row + 1][col + 1] == false) res.push_back(matrix[row][col]); flag[row + 1][col + 1] = true; //check up side if (flag[row][col + 1] == true) break; row--; } //end 如果四周都走过了,就结束 if (flag[row + 2][col + 1] && flag[row + 1][col + 2] && flag[row ][col + 1] && flag[row + 1][col]) { if (flag[row + 1][col + 1] == false) res.push_back(matrix[row][col]); flag[row + 1][col + 1] = true; break; } } return res; } };