1050. 螺旋矩阵(25)
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行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
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define size 10010
int num[size] = { '\0' }; int comp(const void*a, const void*b);
int aim[size][size] = { '\0' };
int main(void)
{
int sum = 0;
scanf("%d", &sum);
for (int i = 0; i < sum; i++)
{
scanf("%d", &num[i]);
}
qsort(num, sum, sizeof(int), comp);
int line = 0, row = 0;
line = (int)sqrt(sum);
row = line;
int mem = line;
while ((line*row) != sum) {
while ((line*row)< sum && (line&&row) != sum) {
line++;
}
if (line*row == sum)
break;
row--;
line = mem;
}
int i, j;
int count = 0;
aim[j = 1][i = 1] = num[count++];
while (count < sum)
{
while (i < row&&aim[j][i + 1] == '\0')
{
aim[j][++i] = num[count++];
}
while (j < line&&aim[j + 1][i] == '\0')
{
aim[++j][i] = num[count++];
}
while (i >1 && aim[j][i - 1] == '\0')
{
aim[j][--i] = num[count++];
}
while (j > 1 && aim[j - 1][i] == '\0')
{
aim[--j][i] = num[count++];
}
}
for (int i = 1; i <= line; i++)
{
int pause = 1;
for (int k = 1; k <= row; k++)
{
if (pause)
{
pause = 0;
}
else
{
printf(" ");
}
printf("%d", aim[i][k]);
}
printf("\n");
}
return 0;
}
int comp(const void * a, const void * b)
{
return *(int*)b - *(int *)a;
}