描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:输入:n = 1
输出:[[1]]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx=0, starty=0; //定义每循环一个圈的起始位置
int loop = n/2; //每个圈循环几次,如果n为奇数3,那么loop=1,只循环一圈
int mid = n/2; //矩阵中间的位置
int count = 1; //用来给矩阵中每一个空格赋值
int offset = 1; //每一圈循环都需要控制每一条边遍历的长度
int i, j;
while(loop--){
i = startx;
j = starty;
// 模拟填充上行从左到右(左闭右开)
for(j=starty; j<starty+n-offset; j++)
res[i][j] = count++;
// 模拟填充右列从上到下(左闭右开)
for(i=startx; i<startx+n-offset; i++)
res[i][j] = count++;
// 模拟填充下行从右到左(左闭右开)
for(; j>starty; j--)
res[i][j] = count++;
// 模拟填充左列从下到上(左闭右开)
for(; i>starty; i--)
res[i][j] = count++;
// 第二圈开始的时候,起始位置要各自加一
startx++;
starty++;
// offset用于控制每一圈中每一条边遍历的长度
offset += 2;
}
// 如果为奇数,需要单独给矩阵中最中间的位置赋值
if(n % 2){
res[mid][mid] = count;
}
return res;
}
};