一.题目
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
二.代码(C)
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes)
{
int **y;
*returnSize = n;
y = (int**)malloc(n*sizeof(int*));
int i;
*returnColumnSizes = (int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
y[i] = (int*)malloc(n*sizeof(int));
memset(y[i],0,n*sizeof(int));
(*returnColumnSizes)[i] = n;
}
int rowMin=0,rowMax=n-1;
int columnMin=0,columnMax=n-1;
int j=0,k=1;
i=0;
while(rowMin<=rowMax && columnMin<=columnMax)
{
//printf("\nrowMin=%d,rowMax=%d,columnMin=%d,columnMax=%d\t",rowMin,rowMax,columnMin,columnMax);
for(j=columnMin;j<=columnMax;j++)
{
//printf("%d ",k);
y[i][j] = k;
k++;
}
j--;
for(i=rowMin+1;i<=rowMax;i++)
{
//printf("%d ",k);
y[i][j] = k;
k++;
}
i--;
for(j=j-1;j>=columnMin;j--)
{
if(rowMin==rowMax)
break;
//printf("%d ",k);
y[i][j] = k;
k++;
}
j++;
for(i=i-1;i>rowMin;i--)
{
if(columnMin==columnMax)
break;
//printf("%d ",k);
y[i][j] = k;
k++;
}
i++;
rowMin++;
rowMax--;
columnMin++;
columnMax--;
//printf("\nrowMin=%d,rowMax=%d,columnMin=%d,columnMax=%d\t",rowMin,rowMax,columnMin,columnMax);
}
printf("1");
return y;
}
三.提交记录
四.备注
从外向内模拟过程。