题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
leetcode链接
思路:螺旋矩阵的圈数为n/2,如果n为奇数,要给最中间位置的值赋值n*n。主要是模拟每一列数据的形成过程。
代码:
#include<vector>
using namespace std;
vector<vector<int>> generateMatrix(int n) //螺旋矩阵
{
vector<vector<int>> result(n, vector<int>(n, 0));
int initx = 0, inity = 0; //每一圈的起始坐标
int loopNumber = n >> 1; //一共有多少圈 按圈赋值 n为奇数时需要单独给最中间的位置赋值
int mid = n >> 1; //奇数时给最中间的赋值
int offset = 1; //换圈时+2
int count = 1; //范围为[1,n*n]
int i, j;
while (loopNumber--)
{
i = initx;
j = inity;
//给四条边赋值时,每一条边左闭右开,即每一条边的最后一个位置在当前这条边不赋值,避免重复赋值
//上列从左到右
for (; j < inity + n - offset; j++) //initx + n - offset表示上列的长度
{
result[i][j] = count++;
}
//右列从上到下
for (; i < initx + n - offset; i++)
{
result[i][j] = count++;
}
//下列从右到左
for (; j > inity; j--)
{
result[i][j] = count++;
}
//左列从下到上
for (; i > initx; i--)
{
result[i][j] = count++;
}
offset += 2;
initx++;
inity++;
}
if (n % 2)
result[mid][mid] = count;
return result;
}
int main()
{
int n;
printf("请输入n: ");
scanf("%d", &n);
vector<vector<int>> matric = generateMatrix(n);
for (size_t i = 0; i < matric.size(); i++)
{
for (size_t j = 0; j < matric[i].size(); j++)
{
printf("%d\t", matric[i][j]);
}
printf("\n");
}
}
结果: