59、螺旋矩阵 II

41 阅读1分钟

59. 螺旋矩阵 II

已解答

中等

相关标签

premium lock icon相关企业

给你一个正整数 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……,审题不严谨。 修改完毕后,程序正常运行。