题目
本题要求将给定的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
我的解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <stdio.h> #include <stdlib.h> #include <math.h>
#define SIZE 10010
int matrix[SIZE][SIZE] = {0};
int cmp(const void *left, const void *right) { return *(int *)right - *(int *)left; }
void getNM(int *n, int *m, int N) { int i = 1; int j = N / i;
while (i <= N && i <= j) { if (i * j == N) { *n = i; *m = j; } j = N / ++i; } }
int main(void) { int N; int n, m; int nums[SIZE]; int x = 0, y = 0; int cur = 0;
scanf("%d", &N); for (int i = 0; i < N; ++i) { scanf("%d", nums + i); }
qsort(nums, N, sizeof(int), cmp);
getNM(&n, &m, N);
matrix[x][y] = nums[cur++]; while (cur < N) { while (y + 1 < n && !matrix[x][y + 1]) { matrix[x][++y] = nums[cur++]; }
while (x + 1 < m && !matrix[x + 1][y]) { matrix[++x][y] = nums[cur++]; }
while (y - 1 >= 0 && !matrix[x][y - 1]) { matrix[x][--y] = nums[cur++]; }
while (x - 1 >= 0 && !matrix[x - 1][y]) { matrix[--x][y] = nums[cur++]; } }
for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (j) { printf(" "); } printf("%d", matrix[i][j]); } printf("\n"); }
return 0; }
|