Problem: 59. 螺旋矩阵 II
思路是根据模拟赋值的过程
① 一圈的赋值操作分为4步:从左到右,从上到下,从右到左,从下到上
② 每一步走几格(即最后一格算是当前步骤的最后一步,还是下一步骤的第一步)
③ 确定循环多少圈
④ 每一圈的起始点
⑤ 奇数矩阵的中心点需要单独赋值
能把以上5点想明白就可以开始编程序了
① 横坐标用i循环,纵坐标用j循环
② 设置偏移量,循环圈数越大,偏移量就越大
③ 找规律,循环圈数为n / 2
④ 每圈的起始点连起来就是矩阵的左上到右下的对角线
⑤ n % 2可判断奇偶
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> reslut(n, vector<int>(n, 0)); // n行 n列 默认值为0
int xstart = 0;
int ystart = 0;
int loop = n / 2;
int mid = n / 2; // 当n为奇数时,中间位置单独赋值
int count = 1; // 需要赋值的数从1~n
int offset = 1; // 左闭右开的偏移量
int i, j; // 循环变量
while(loop--)
{
i = xstart;
j = ystart;
// 从左到右
for (; j < n - offset; j++)
reslut[xstart][j] = count++;
// 从上到下
for (; i < n - offset; i++)
reslut[i][j] = count++;
// 从右到左
for (; j > ystart; j--)
reslut[i][j] = count++;
// 从下到上
for (; i > xstart; i--)
reslut[i][ystart] = count++;
xstart++;
ystart++;
offset++;
}
if (n % 2)
reslut[mid][mid] = n * n;
return reslut;
}
};