剑指Offer第19题:顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
[[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.

解题思路:顺时针打印,服从右下左上的规律,可使用leecode上岛屿的个数思路解决,对访问过的元素设置一个标志值,按照规律访问剩下的数组,注意,顺时针的右下左上中的“右”需要满足一定的条件才可以往右走,此条件为:当前行是第0行,或者上一行已经被遍历过

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void printMatrixHelper(vector<vector<int> > &matrix, vector<int> &res, int i, int j, int r, int c) {
res.push_back(matrix[i][j]); //将当前值添加值结果中
matrix[i][j] = INT_MAX; //遍历过的值置为INT_MAX
if (j+1 < c && matrix[i][j+1] != INT_MAX && (i==0 || matrix[i-1][j]==INT_MAX)) //往右的条件,当前行是第0行,或者上一行被遍历过
printMatrixHelper(matrix, res, i, j+1, r, c);
if (i+1 < r && matrix[i+1][j] != INT_MAX ) //判断边界条件,判断是否被遍历过
printMatrixHelper(matrix, res, i+1, j, r, c);
if (j-1 >= 0 && matrix[i][j-1] != INT_MAX )
printMatrixHelper(matrix, res, i, j-1, r, c);
if (i-1 >= 0 && matrix[i-1][j] != INT_MAX )
printMatrixHelper(matrix, res, i-1, j, r, c);
}
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;
int r = matrix.size();
if (r == 0) return res;
int c = matrix[0].size();
printMatrixHelper(matrix, res, 0, 0, r, c);
return res;
}