PAT乙級1050 螺旋矩陣
阿新 • • 發佈:2018-12-01
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; }