螺旋矩阵(已优化)

 

这是一道模拟题,我们首先定义一个二维数组,然后将他的边界定义出来,定义好边界后就开始往数组中放数字,每次到达边界,就改变方向,但注意奇数的螺旋矩阵最中间的数需要自己定义,否则会造成死循环

以下代码实现(优化前)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
    //二维数组初始化
    int k;
    scanf("%d", &k);
    int** a = (int**)malloc(sizeof(int*) * k);
    for (int h = 0; h < k; h++)
        a[h] = (int*)malloc(sizeof(int) * k);
    //边界初始化
    int m = 0, n = k-1, x = 0, y = k-1;
    //定义行和列
    int i = 0, j = 0;
    //计数
    int u = 1;
    //当奇数矩阵时,将最中间的位置,特殊规定
    if (k % 2 == 1)
        a[k / 2][k / 2] = k * k;
    //开始填数
    while (1)
    {
        //每次到达边界改变方向
        for (; j < n; j++)
        {
            a[i][j] = u++;
            if (u > k*k)break;
        }
        if (u > k * k)break;

        for (; i < y; i++)
        {
            a[i][j] = u++;
            if (u > k * k)break;
        }
        if (u > k * k)break;

        for (; j > m; j--)
        {
            a[i][j] = u++;
            if (u > k * k)break;
        }
        if (u > k * k)break;

        for (; i > x; i--)
        {
            a[i][j] = u++;
            if (u > k * k)break;
        }
        if (u > k * k)break;
        //奇数的最后一个数是k*k-1,所以特殊规定
        if (k % 2 == 1 && u == k * k )
            break;

        //填完一圈之后缩小矩阵范围
        m++; n--; x++; y--;
        //将行和列放在正确的方向上
        i++; j++;
    }

    //输出
    for (int g = 0; g < k; g++)
    {
        for (int h = 0; h < k; h++)
        {
            printf("%3d", a[g][h]);
        }
        printf("\n");
    }
    return 0;
}

c++:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
    
    vector<vector<int>> res(n, vector<int>(n, 0));
    int m = 0, v = n-1, x = 0, y = n-1;

    int i = 0, j = 0;

    int u = 1;

    if (n % 2 == 1)
        res[n / 2][n / 2] = n * n;
    while (1)
    {
        for (; j < v; j++)
        {
            res[i][j] = u++;
            if (u > n*n)break;
        }
        if (u > n * n)break;

        for (; i < y; i++)
        {
            res[i][j] = u++;
            if (u > n * n)break;
        }
        if (u > n * n)break;

        for (; j > m; j--)
        {
            res[i][j] = u++;
            if (u > n * n)break;
        }
        if (u > n * n)break;

        for (; i > x; i--)
        {
            res[i][j] = u++;
            if (u > n * n)break;
        }
        if (u > n * n)break;

        if (n % 2 == 1 && u == n * n )
            break;

        m++; v--; x++; y--;
        i++; j++;
    }

    for (int g = 0; g < n; g++)
    {
        for (int h = 0; h < n; h++)
        {
            printf("%3d", res[g][h]);
        }
        printf("\n");
    }
    return res;
    }
};

 

优化后:

每次都判断出下一个为零,然后立马将数字填上

#include<stdio.h>
#include<string.h>
int main(void)
{
    int a[20][20];
    memset(a, 0, sizeof(a));

    int n;
    scanf("%d", &n);
    int tot = 0;
    int x = 0;
    int y = n - 1;
    a[x][y] = 1;
    tot++;

    while (tot < n * n)
    {
        while (x + 1 < n && !a[x + 1][y])
            a[++x][y] = ++tot;
        while (y - 1 >= 0 && !a[x][y - 1])
            a[x][--y] = ++tot;
        while (x - 1 >= 0 && !a[x - 1][y]) 
            a[--x][y] = ++tot;
        while (y + 1 < n && !a[x][y + 1])
            a[x][++y] = ++tot;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%3d ", a[i][j]);
        }
        printf("\n");
    }
}

 

posted @ 2021-01-18 10:27  loliconsk  阅读(189)  评论(0)    收藏  举报