题目描述:
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
解题思路:
螺旋矩阵的问题就是把1->n*n的序列依次填进矩阵中。都是从最外层填到最内层。
AC代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n,vector<int>(n,0));
int count=1;
int x=0,y=0;
res[0][0]=count;
while(count<n*n)
{
while(y+1<n&&!res[x][y+1])
res[x][++y]=++count;
while(x+1<n&&!res[x+1][y])
res[++x][y]=++count;
while(y-1>=0&&!res[x][y-1])
res[x][--y]=++count;
while(x-1>=0&&!res[x-1][y])
res[--x][y]=++count;
}
return res;
}
};
问题进阶:
外螺旋、内螺旋和三角螺旋矩阵:
//内螺旋
vector<vector<int>> generateMatrix_I(int n)
{
vector<vector<int> >res(n, vector<int>(n, 0));
int count = 1;
int x = 0, y = 0;
res[0][0] = count;
while (count<n*n)
{
while (y + 1<n && !res[x][y + 1])
res[x][++y] = ++count;
while (x + 1<n && !res[x + 1][y])
res[++x][y] = ++count;
while (y - 1 >= 0 && !res[x][y - 1])
res[x][--y] = ++count;
while (x - 1 >= 0 && !res[x - 1][y])
res[--x][y] = ++count;
}
return res;
}
//外螺旋
vector<vector<int>> generateMatrix_O(int n)
{
vector<vector<int> >res(n, vector<int>(n, 0));
int count = n*n;
int x = 0, y = 0;
res[0][0] = n*n;
while (count>1)
{
while (y + 1<n && !res[x][y + 1])
res[x][++y] = --count;
while (x + 1<n && !res[x + 1][y])
res[++x][y] = --count;
while (y - 1 >= 0 && !res[x][y - 1])
res[x][--y] = --count;
while (x - 1 >= 0 && !res[x - 1][y])
res[--x][y] = --count;
}
return res;
}
//三角螺旋
vector<vector<int>> generateMatrix_T(int n)
{
vector<vector<int> >res(n, vector<int>(n, 0));
int count = 1;
int x = 0, y = 0;
res[0][0] = count;
while (count<(n*(n+1)/2))
{
while (y + 1<n && !res[x][y + 1])
res[x][++y] = ++count;
while (x + 1<n && !res[x + 1][y-1])
res[++x][--y] = ++count;
while (x - 1 >= 0 && !res[x - 1][y])
res[--x][y] = ++count;
}
return res;
}