该题的关键,就是可以新建各个方向上的偏移值,来减少重复的判断条件,减少代码量和出错率。
改题蛇沿着右->下->左->上的条件进行走,如走到边界处或者要走的方向已经走过,则改变走的方向。
#include <bits/stdc++.h>
using namespace std;
// 右下左上
int matrix[9][9], director[][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main() {
int n;
cin >> n;
int x = 0, y = 0, cur = 0;
for (int i = 0, len = n * n; i < len; ++i) {
matrix[x][y] = i + 1;
int dx = x + director[cur][0], dy = y + director[cur][1];
if (dx >= n || dx < 0 ||
dy >= n || dy < 0 ||
matrix[dx][dy] > 0) {
cur = (cur + 1) % 4;
}
x += director[cur][0];
y += director[cur][1];
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%3d", matrix[i][j]);
}
cout << endl;
}
return 0;
}
此题按照右->下->左->上的条件遍历即可,每遍历过一个位置将遍历过的位置设标记为 -105(数据范围为-100 <= matrix[i][j] <= 100),或者新开辟一个数组记录每次遍历过的位置也可。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>> &matrix) {
vector<int> ans;
int row = matrix.size(), col = matrix[0].size();
int x = 0, y = 0, cur = 0;
int dir[][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
for (int i = 0, len = row * col; i < len; ++i) {
ans.push_back(matrix[x][y]);
matrix[x][y] = -105;
int dx = x + dir[cur][0], dy = y + dir[cur][1];
if (dx >= row || dx < 0 ||
dy >= col || dy < 0 ||
matrix[dx][dy] == -105) {
cur = (cur + 1) % 4;
}
x += dir[cur][0];
y += dir[cur][1];
}
return ans;
}
};