给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res;
int len1 = n, len2 = n;
for(int i = 0; i < n; i++)
{
vector<int> temp;
for(int j = 0; j < n; j++)
{
temp.emplace_back(0);
}
res.emplace_back(temp);
}
int a = (n + 1) / 2;
int num = 1;
for(int i = 0; i < a; ++i)
{
// 从 左 往 右
int start1 = i; // 行
int start2 = i; // 列
for(int j = start2; j < len2 - i; ++j)
{
// cout<<"从 左 往 右"<<matrix[start1][j]<<endl;
// res.emplace_back(matrix[start1][j]);
res[start1][j] = num;
num++;
}
start2 = (len2-1) - i;
// 从 上 往 下
for(int j = start1 + 1; j < len1 - i; ++j)
{
// res.emplace_back(matrix[j][start2]);
res[j][start2] = num;
num++;
}
start1 = (len1-1) - i;
// if(start1 == (len1+1) / 2)
if(len1 % 2 == 1 && start1 == (len1-1) / 2)
break;
// 从 右 往 左
for(int j = start2 - 1; j >= i; --j)
{
// if(i == a-1 && len1 % 2 == 1)
// break;
// res.emplace_back(matrix[start1][j]);
res[start1][j] = num;
num++;
}
start2 = i;
if(len2 % 2 == 1 && start2 == (len2-1) / 2)
break;
// 从 下 往 上
for(int j = start1 - 1; j >= i+1; --j)
{
// cout<<"从 下 往 上"<<matrix[j][start2]<<endl;
// res.emplace_back(matrix[j][start2]);
res[j][start2] = num;
num++;
}
}
return res;
}
};