AcWing 40. 顺时针打印矩阵
原题链接
中等
C++ 代码
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) return vector<int>();
vector<int> v;
int n = matrix.size(), m = matrix[0].size();
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
vector<vector<bool>> flags(n, vector<bool>(m, false)); // 标记已经走过的位置
int x = 0, y = 0;
int k = 1; // 起始方向为 "右"
for(int i = 0; i < m * n; ++i)
{
v.push_back(matrix[x][y]);
flags[x][y] = true;
int nx = x + dx[k], ny = y + dy[k];
if(nx < 0 || nx >= n || ny < 0 || ny >= m || flags[nx][ny]) // 当前位置出界,改变方向
{
k = (k + 1) % 4;
nx = x + dx[k], ny = y + dy[k]; // 重新计算新坐标的位置
}
x = nx; // 合法坐标
y = ny;
}
return v;
}
};