P1050 螺旋矩阵
P1050 螺旋矩阵
转跳点:🐏
1050 螺旋矩阵 (25分)
本题要求将给定的 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
这道题啊,模拟的我好苦啊,我第一波模拟错了3个,打死也就没改出来了,干脆推了重写了一遍,AC了,狗啊,这么AC的都不知道,哭死
这道题没什么好说的,就是碰壁模拟,上下左右四个边界,碰到就转向就可以了。哦,题目说了非递增顺序,记得降序排序哦~
我第一次的代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> int matrixsize(int n); int cmp(const void *a, const void *b) { return (*(int *)a) < (*(int *)b) ? 1 : -1; } int arr[10000], Matrix[10000][1000]; int main(void) { int size, n, m; scanf("%d", &size); m = matrixsize(size); n = size / m; for (int i = 0; i < size; i++) { scanf("%d", &arr[i]); } qsort(arr, size, sizeof(arr[0]), cmp); int up = -1, down = m, left = -1, right = n; int i = 0, j = 0, index = 0; while (index < size) { //向右填充 while (j < right) { Matrix[i][j] = arr[index++]; j++; } up++; i++; j--; //向下填充 while (i < down) { Matrix[i][j] = arr[index++]; i++; } right--; i--; j--; //向左填充 while (j > left) { Matrix[i][j] = arr[index++]; j--; } down--; i--; j++; //向上填充 while (i > up) { Matrix[i][j] = arr[index++]; i--; } left++; i++; j++; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d%s", Matrix[i][j], n - 1 == j ? "" : " "); } putchar('\n'); } return 0; } //矩阵的行 int matrixsize(int n) { int m; m = (int)sqrt(n); if (m - sqrt(n) == 0) { return m; } m++; while (0 != n % m) { m++; } return m; }
真的是打死也想不出来了,试了5*5, 4*3 ,6*5, 10*10各种,没看出哪错了,模拟题就是恶心……
AC代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> int matrixsize(int n); int cmp(const void *Matrix, const void *b) { return (*(int *)Matrix) < (*(int *)b) ? 1 : -1; } int arr[10000], Matrix[10000][1000]; int main(void) { int size, n, m; scanf("%d", &size); m = matrixsize(size); n = size / m; for (int i = 0; i < size; i++) { scanf("%d", &arr[i]); } qsort(arr, size, sizeof(arr[0]), cmp); Matrix[1][1] = arr[0]; int index = 0; int i = 1, j = 1; //前面已经存了一个了 while (index < size - 1) {//上下左右四个边界,这次利用了存储值非0的特性,因为上一次有一个越界干脆从1开始 while (j + 1 <= n && !Matrix[i][j + 1]) { Matrix[i][++j] = arr[++index]; } while (i + 1 <= m && !Matrix[i + 1][j]) { Matrix[++i][j] = arr[++index]; } while (j - 1 > 0 && !Matrix[i][j - 1]) { Matrix[i][--j] = arr[++index]; } while (i - 1 > 0 && !Matrix[i - 1][j]) { Matrix[--i][j] = arr[++index]; } } for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { printf("%d%s", Matrix[i][j], n == j ? "" : " "); } putchar('\n'); } return 0; } //矩阵的行 int matrixsize(int n) { int m; m = (int)sqrt(n); if (m - sqrt(n) == 0) { return m; } m++; while (0 != n % m) { m++; } return m; }
PTA不易,诸君共勉!
大道五十,天衍四九,人遁其一!