本题要求将给定的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 7658 60 76
好冷啊...脑子和浆糊一样
#include <stdio.h> #include <stdlib.h> void cmp(const void* a, const void*b) { return *(int*)b - *(int*)a; } int main() { int number; int n, m, M, N, min = 9999, flag = 1, arr[300][300], i = 0, j = 0, nowi = 0, nowj = 0, num[20000], count = 0, M1, N1, flagminus = 0; scanf("%d", &number); for (i = 0; i < number; i++) scanf("%d", &num[i]); for (i = 0; i < number; i++) printf("%d ", num[i]); printf("\n"); qsort(num, number, sizeof(int), cmp); for (i = 0; i < number; i++) printf("%d ", num[i]); printf("\n"); for (m = 0; m <= number;m++) for (n = 0; n <= m; n++) { if (m*n==number&&m - n < min) { M = m; N = n; min = m - n; } } M1 = M; N1 = N; printf("%d %d\n", M, N); while (M > 0 || N > 0) { for (i = 0; i < N; i++) { arr[nowi][nowj + i*flag] = num[count]; count++; } nowj += (N-1)*flag; if (flagminus == 0 && M > N) { N++; flagminus = 1; } N--; count--; for (i = 0; i < M; i++) { arr[nowi + i*flag][nowj] = num[count]; count++; } nowi += (M-1)*flag; M--; if (count == n) break; count--; flag *= -1; } for (i = 0; i < M1;i++) for (j = 0; j < N1; j++) { if (j == N1 - 1) printf("%d\n", arr[i][j]); else printf("%d ", arr[i][j]); } system("pause"); return 0; }