已解答
中等
相关标签
相关企业
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: n = 1
输出: [[1]]
提示:
1 <= n <= 20
题解: 写一圈比较好些,加一个loop参数用来调整不同圈,圈数loop = (n + 1) / 2。 每一圈用loop表示,然后写成循环。 四个顶点:左上(loop, loop),右上(loop, n - loop + 1),左下(n - loop + 1, loop),右下(n - loop + 1, n - loop + 1)。
#include <stdlib.h>
#include <stdio.h>
int main ()
{
int n, i, j, loop, num = 1;
scanf ("%d", &n);
if (n <= 0)
{
return 0;
}
int** ans = (int**)malloc(sizeof(int*) * n + 1);
for (i = 0;i <= n;i ++)
{
ans[i] = (int*)malloc(sizeof(int) * n + 1);
}
//分奇偶讨论,偶数正常,奇数最中间那个没值
if (n % 2 == 1)
{
ans[n / 2 + 1][n / 2 + 1] = n * n;
}
for (loop = 1;loop <= (n + 1) / 2;loop ++)
{
for (i = loop;i < n - loop + 1;i ++)//左上到右上(左闭右开)
{
ans[loop][i] = num;
num ++;
}
for (i = loop;i < n - loop + 1;i ++)//右上到右下(左闭右开)
{
ans[i][n - loop + 1] = num;
num ++;
}
for (i = n - loop + 1;i > loop;i --)//右下到左下(左闭右开)
{
ans[n - loop + 1][i] = num;
num ++;
}
for (i = n - loop + 1;i > loop;i --)//左下到左上(左闭右开)
{
ans[i][loop] = num;
num ++;
}
}
for (i = 1;i <= n;i ++)
{
for (j = 1;j <= n;j ++)
{
printf("%d ", ans[i][j]);
}
printf ("\n");
}
return 0;
}
过程中bug: 每一条边是横坐标变化纵坐标不动,还是反过来一开始弄反了; 未区分n的奇偶,原来的方法对于奇数,最中间的那个块没有值; 题目要的是1-n^2,而不是1^2, 2^2……,审题不严谨。 修改完毕后,程序正常运行。