題目
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example, Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
分析
使用上題同樣的思路:http://www.reibang.com/p/95f8ed55903b
在上題螺旋記錄數(shù)據(jù)的地方改為數(shù)組的賦值即可顺又。
這里使用的4個方向的判斷中烦租,可以使用循環(huán)汛聚,直到該方向完成才結(jié)束颜说,速度應該更快一點漓糙,不過所有的提交代碼運行時間都一樣卿闹。
/**
* Return an array of arrays.
* Note: The returned array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n) {
int **ans=(int **)malloc(sizeof(int *)*n);
if(n==0)return ans;
for(int i=0;i<n;i++)
ans[i]=(int *)malloc(sizeof(int)*n);
int circle=0;//第幾圈
int p=1;//螺旋旋轉(zhuǎn)方向1->2->3->4->1
int r=0,c=0;//當前旋轉(zhuǎn)到的位置
int num=0;
ans[0][0]=1;
while(num<n*n)
{
//printf("%d %d\n",r,c);
if(p==1)
{
if(c<n-circle-1)
{
ans[r][c]=num+1;
c++;
num++;
}
else
p=2;
}
else if(p==2)
{
if(r<n-circle-1)
{
ans[r][c]=num+1;
r++;
num++;
}
else
p=3;
}
else if(p==3)
{
if(c>circle)
{
ans[r][c]=num+1;
c--;
num++;
}
else if(c==circle)
{
ans[r][c]=num+1;
r--;
p=4;
num++;
}
}
else
{
if(r>circle+1)
{
ans[r][c]=num+1;
r--;
num++;
}
else if(r==circle+1)
{
ans[r][c]=num+1;
c++;
num++;
p=1;
circle++;
}
}
}
return ans;
}