题目链接
思路
这道题不涉及算法,只是进行模拟一个过程。但是在模拟时会出现很多问题,比如:循环转圈多少次?、边界怎么处理等等。为了每次处理边界时一致,我们采用以下的遍历方式,如下图所示:
每条边的终点由一个变量控制,因为它随着圈数而改变;如果n为奇数还需要单独处理中间位置。
代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); //用来存结果
int count = 1; //待输入的数字
int num = n / 2; //转几圈
int start_x = 0; //初始x坐标
int start_y = 0; //初始y坐标
int offset = 1; //控制每行的终点
while (num--){
int j = start_y;
int i = start_x;
for (; j < n - offset; j++){
res[i][j] = count++;
}
for (; i < n - offset; i++){
res[i][j] = count++;
}
for (; j > start_y; j--){
res[i][j] = count++;
}
for (; i > start_x; i--){
res[i][j] = count++;
}
start_x++; //更新下一圈
start_y++;
offset++;
}
if (n % 2 == 1){ //为奇数
res[n / 2][n / 2] = count++;
}
return res;
}
};