PAT乙级1050 螺旋矩阵

来源:互联网 发布:淘宝虚拟充值店加盟 编辑:程序博客网 时间:2024/05/09 23:46

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个空格分隔,行末不得有多余空格。

输入样例:
1237 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 9342 37 8153 20 7658 60 76

#include <stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define size 10010int 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;}


0 0
原创粉丝点击