根据题意我们要将给定的数字转化为每行以及每列的长度,代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
//定义循环的起始位置
int startx = 0;
int starty = 0;
//定义每个圈循环几次,如果n为基数3,loop=1 循环一次
int loop = n/2;
//矩阵中间的位置,例如:n为3,中间的位置就是1,1
int mid = n/2;
int count = 1;//用来给矩阵中每个空格赋值,就是123456789
int offset = 1;
int i,j;
while(loop --){
i = startx;
j = starty;
//下面for循环来表示转圈!!
//从左到右 上行
for(j = starty;j< n - offset;j ++){//123
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++;
}
//第二圈开始起始位置要各自+1
startx++;
starty++;
//用于控制每一圈中每一条遍历的长度
offset += 1;
}
if(n % 2) {
res[mid][mid] = count;
}
return res;
}
};
在编写的过程中应该考虑重点分析循环的原则,保证不变量的规则,简直左闭右开,画圈圈!
最后判断如果是奇数的话,需要单独给中心点赋值,
如果数字为偶数就不用。