class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
int n = matrix.size();
// 特断是否有元素存在,不存在直接返回res
if(!n)
return res;
int m = matrix[0].size();
if(!m)
return res;
// dx和dy分别代表向横坐标和纵坐标方向移动的幅度
// 当遍历到边界的时候需要变一下方向
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
// M 将遍历过得元素赋值为M表示走过了
int M = INT_MAX - 1;
int k = 0;
int i = 0, j = 0;
// 必须先判断i和j是否已经出界,在判断matrix[i][j],否则会产生segment out错误
// 当元素出界或是第二次遇到遍历过的元素,即为遍历到底
while(i >=0 && i < n && j >= 0 && j < m && matrix[i][j] != M) {
int x = matrix[i][j];
matrix[i][j] = M;
res.push_back(x);
// 先判断三个边界条件
if(i + dx[k] == n || j + dy[k] == m || j + dy[k] == -1)
k = (k + 1) % 4;
// 后判断前一个元素是否走过,如果走过需要变一下方向
else if(matrix[i + dx[k]][j + dy[k]] == M)
k = (k + 1) % 4;
i = i + dx[k];
j = j + dy[k];
}
return res;
}
};