classSolution{public:// 前进方向,分别表示右下左上
vector<vector<int>> direction{{0,1},{1,0},{0,-1},{-1,0},};
vector<int>spiralOrder(vector<vector<int>>& matrix){if(matrix.empty()|| matrix[0].empty())return vector<int>();int m = matrix.size(), n = matrix[0].size(), steps = m * n;
vector<int> ans;
vector<vector<bool>>visited(m, vector<bool>(n,false));int y =0, x =0, dir =0;for(int i =0; i < steps;++i)spiralOrderCore(matrix, ans, visited, m, n, y, x, dir);return ans;}voidspiralOrderCore(vector<vector<int>>& matrix, vector<int>& ans,
vector<vector<bool>>& visited,constint m,constint n,int& y,int& x,int& dir){
visited[y][x]=true;
ans.push_back(matrix[y][x]);// 探索是否需要更改前进方向int newY = y + direction[dir][0];int newX = x + direction[dir][1];if(newY <0|| newY >= m || newX <0|| newX >= n || visited[newY][newX])
dir =(dir +1)%4;// 前进一格
y += direction[dir][0];
x += direction[dir][1];}};