Skip to content

1050 螺旋矩阵

Statement

Metadata

  • 作者: CHEN, Yue
  • 单位: 浙江大学
  • 代码长度限制: 16 KB
  • 时间限制: 200 ms
  • 内存限制: 64 MB

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

输入格式

输入在第 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

Solution

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int comp(const void *p, const void *q);
int main() {
    int n, x, y;
    scanf("%d", &n);
    int num[n];
    int i, j;
    for (i = 0; i < n; i++) {
        scanf("%d", &num[i]);
    }
    qsort(num, n, sizeof(int), comp);
    int M, N;
    int flag1 = 0, flag2 = 0;
    int min = INT_MAX;
    for (M = 1; M <= n; M++) {
        for (N = 1; N <= n; N++) {
            if (M * N == n && M - N < min && M >= N) {
                min = M - N;
                flag1 = M;
                flag2 = N;
            }
        }
    }
    // printf("%d %d\n",flag1,flag2);
    int num2[flag1][flag2];
    memset(num2, 0, sizeof(num2));
    num2[x = 0][y = 0] = num[0];
    int tot = 1;
    while (tot < n) {
        while (y + 1 < flag2 && !num2[x][y + 1]) num2[x][++y] = num[tot++];  //向右
        while (y - 1 >= 0 && !num2[x][y - 1]) num2[x][--y] = num[tot++];     //向左
        while (x - 1 >= 0 && !num2[x - 1][y]) num2[--x][y] = num[tot++];     //左上
        while (x + 1 < flag1 && !num2[x + 1][y]) num2[++x][y] = num[tot++];  //右下
    }
    for (i = 0; i < flag1; i++) {
        for (j = 0; j < flag2; j++) {
            if (j)
                printf(" %d", num2[i][j]);
            else
                printf("%d", num2[i][j]);
        }
        printf("\n");
    }
}
int comp(const void *p, const void *q) {
    return (*(int *)q - *(int *)p);
}

Last update: May 4, 2022
Back to top