P1050 螺旋矩阵

P1050 螺旋矩阵

转跳点:🐏

1050 螺旋矩阵 (25分)

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 Nmn;且 mn 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10​4​​,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

这道题啊,模拟的我好苦啊,我第一波模拟错了3个,打死也就没改出来了,干脆推了重写了一遍,AC了,狗啊,这么AC的都不知道,哭死

这道题没什么好说的,就是碰壁模拟,上下左右四个边界,碰到就转向就可以了。哦,题目说了非递增顺序,记得降序排序哦~

我第一次的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int matrixsize(int n);
int cmp(const void *a, const void *b) { return (*(int *)a) < (*(int *)b) ? 1 : -1; }

int arr[10000], Matrix[10000][1000];

int main(void)
{
    int size, n, m;
    scanf("%d", &size);
    m = matrixsize(size);
    n = size / m;

    for (int i = 0; i < size; i++)
    {
        scanf("%d", &arr[i]);
    }

    qsort(arr, size, sizeof(arr[0]), cmp);

    int up = -1, down = m, left = -1, right = n;
    int i = 0, j = 0, index = 0;
    while (index < size)
    {
        //向右填充
        while (j < right)
        {
            Matrix[i][j] = arr[index++];
            j++;
        }
        up++;
        i++;
        j--;

        //向下填充
        while (i < down)
        {
            Matrix[i][j] = arr[index++];
            i++;
        }
        right--;
        i--;
        j--;

        //向左填充
        while (j > left)
        {
            Matrix[i][j] = arr[index++];
            j--;
        }
        down--;
        i--;
        j++;

        //向上填充
        while (i > up)
        {
            Matrix[i][j] = arr[index++];
            i--;
        }
        left++;
        i++;
        j++;
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d%s", Matrix[i][j], n - 1 == j ? "" : " ");
        }
        putchar('\n');
    }

    return 0;
}

//矩阵的行
int matrixsize(int n)
{
    int m;
    m = (int)sqrt(n);
    if (m - sqrt(n) == 0)
    {
        return m;
    }
    m++;
    while (0 != n % m)
    {
        m++;
    }
    return m;
}

 

真的是打死也想不出来了,试了5*5, 4*3 ,6*5, 10*10各种,没看出哪错了,模拟题就是恶心……

AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int matrixsize(int n);
int cmp(const void *Matrix, const void *b) { return (*(int *)Matrix) < (*(int *)b) ? 1 : -1; }

int arr[10000], Matrix[10000][1000];

int main(void)
{
    int size, n, m;
    scanf("%d", &size);
    m = matrixsize(size);
    n = size / m;

    for (int i = 0; i < size; i++)
    {
        scanf("%d", &arr[i]);
    }

    qsort(arr, size, sizeof(arr[0]), cmp);

    Matrix[1][1] = arr[0];
    int index = 0;
    int i = 1, j = 1;
        
        //前面已经存了一个了
    while (index < size - 1)
    {//上下左右四个边界,这次利用了存储值非0的特性,因为上一次有一个越界干脆从1开始
        while (j + 1 <= n && !Matrix[i][j + 1])
        {
            Matrix[i][++j] = arr[++index];
        }
        while (i + 1 <= m && !Matrix[i + 1][j])
        {
            Matrix[++i][j] = arr[++index];
        }
        while (j - 1 > 0 && !Matrix[i][j - 1])
        {
            Matrix[i][--j] = arr[++index];
        }
        while (i - 1 > 0 && !Matrix[i - 1][j])
        {
            Matrix[--i][j] = arr[++index];
        }
    }

    for (i = 1; i <= m; i++)
    {
        for (j = 1; j <= n; j++)
        {
            printf("%d%s", Matrix[i][j], n == j ? "" : " ");
        }
        putchar('\n');
    }

    return 0;
}

//矩阵的行
int matrixsize(int n)
{
    int m;
    m = (int)sqrt(n);
    if (m - sqrt(n) == 0)
    {
        return m;
    }
    m++;
    while (0 != n % m)
    {
        m++;
    }
    return m;
}

 

PTA不易,诸君共勉!

posted @ 2020-02-10 19:38  秦_殇  阅读(134)  评论(0编辑  收藏  举报