题目略。
解题思路:
当成一个点在转圈就好了,从开始到结束一共走n*n个点,分四个方向,每个方向的走路变化分别为[0,1],[1,0],[0,-1],[-1,0]。然后在走的时候加个碰壁判断就好了,碰壁的情况有两种,一种是超出n,一种是之前走过,所以可以用一个vis数组记录下。
(打oj打习惯了,第一次打力扣写起来有点不太习惯)
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int res[30][30];
int vis[30][30];
memset(vis,0,sizeof(vis));
int curx=1,cury=1;
int tot = n*n;
int cur = 1;
int dir = 1;
while(tot--)
{
res[curx][cury]=cur++;
vis[curx][cury]=1;
if(dir==1)
{
if(vis[curx+1][cury]||curx+1>n)
{
dir=2;
}
}
else if(dir==2)
{
if(vis[curx][cury+1]||cury+1>n)
{
dir=3;
}
}
else if(dir==3)
{
if(vis[curx-1][cury]||curx-1==0)
{
dir=4;
}
}
else
{
if(vis[curx][cury-1])
{
dir=1;
}
}
if(dir==1) curx+=1;
else if(dir==2) cury+=1;
else if(dir==3) curx-=1;
else if(dir==4) cury-=1;
}
/*
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<res[j][i]<<" ";
}
cout<<endl;
}
*/
vector<vector<int>> ret;
for(int i=1;i<=n;i++)
{
vector<int> v;
for(int j=1;j<=n;j++)
{
v.push_back(res[j][i]);
}
ret.push_back(v);
}
return ret;
}
};