题目描述
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
本题思路
模拟数字一个个螺旋放入矩阵
代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(
n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int loop = n / 2; // 要螺旋排列的圈数
int startx = 0, starty = 0; // 用来表示每次行或列循环的开始
int mid = n / 2; // 用以表示n为奇数时最中间的坐标位置
int count = 1; // 对每个位置赋值就加一
int offset = 1;
int i, j;
while (loop--) {
i = startx;
j = starty;
// 模拟一圈的上行从左到右
for (j = starty; j < n - offset; j++)
res[startx][j] = count++;
// 模拟一圈的右列从上到下
for (i = startx; i < n - offset; i++)
res[i][j] = count++;
// 模拟一圈的下行从右到左
for (; j > starty; j--)
res[i][j] = count++;
// 模拟一圈的左列从下到上
for (; i > startx; i--)
res[i][j] = count++;
// 每循环一次开始就从前一次的位置坐标都加一
startx++;
starty++;
// 一圈后排列的长度减一
offset--;
}
if (n % 2 == 1)
res[mid][mid] = count;
return res;
}
};
利用循环不变量,每一行一列左闭右开,四个for循环,定义两个变量startx,starty表示下次开始的坐标。offser表示每转完一圈就减一,用来限制每次写数的长度
上行行不变,右列列不变,下行行不变,左列列不变 下行别越起始横坐标,左列别越起始纵坐标