classSolution { public: vector<int> spiralOrder(vector<vector<int>>& matrix){ int m = matrix.size(), n = matrix[0].size(); vector<vector<bool>> visited(m, vector<bool>(n)); vector<int> ans; int dx[] = {0, 1, 0, -1}; int dy[] = {1, 0, -1, 0}; int x = 0, y = 0, d = 0;
for (int k = 0; k < m * n; ++k) { ans.push_back(matrix[x][y]); visited[x][y] = true; if (k == m * n - 1) break;
int nx = x + dx[d], ny = y + dy[d]; if (nx < 0 || nx >= m || ny < 0 || ny >= n || visited[nx][ny]) { d = (d + 1) % 4; } x += dx[d]; y += dy[d]; } return ans; } };
private: voidtraverse(vector<vector<int>>& a, int top, int bottom, int left, int right, vector<int>& ans){ if (top > bottom || left > right) return;
for (int j = left; j <= right; ++j) ans.push_back(a[top][j]); for (int i = top + 1; i <= bottom; ++i) ans.push_back(a[i][right]);
if (top < bottom && left < right) { for (int j = right - 1; j >= left; --j) ans.push_back(a[bottom][j]); for (int i = bottom - 1; i > top; --i) ans.push_back(a[i][left]); }
traverse(a, top + 1, bottom - 1, left + 1, right - 1, ans); } };