给出正整数n,生成一个包含1到n^2所有元素,且元素按顺时针顺序螺旋排列的n*n正方形矩阵 matrix,示例如下:
解答此题需要模拟循环的过程,循环过程如下:
(1)当n为奇数时
(2)当n为偶数时
由上面两图可以看出:
1.循环次数(圈数)loop=n/2;
2.每一圈循环的边长为n-offset(offset=1,每过一圈offset+2);
3.若为奇数,需要再额外定义一下中心位置的值。
根据上面的规律,可以写出如下代码:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> a(n,vector<int>(n,0));
//如果n为奇数,需要单独给中间位置赋值
if(n%2 != 0) {
a[n/2][n/2] = n*n;
}
int startx = 0,starty = 0;
int loop = n/2; //每圈循环次数
int mid = n/2; //中间位置坐标
int count = 1; //用来赋值
int offset = 1; //每圈循环的边的长度
int i, j;
while(loop--) {
i = startx;
j = starty;
//四个for循环模拟转一圈,左闭右开
//填充上边从左到右
for(j = starty; j< starty + n - offset; j++) {
a[startx][j] = count++;
}
//填充右边从上到下
for (i = startx; i<startx + n - offset; i++) {
a[i][j] = count++;
}
//填充下边从右到左
for (; j>starty; j--) {
a[i][j] = count++;
}
//填充左边从下到上
for (; i>startx; i--) {
a[i][j] = count++;
}
//第二圈开始
startx++;
starty++;
offset = offset + 2;
}
return a;
}