题目粗心
将给定的N个正整数按非递增的程序,填入“螺旋矩阵”,所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充,要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值.
算法思路
此题的求解步骤分为求解矩阵规模和填充矩阵
- 1、求解矩阵规模
因为须要行和列都尽可能的相近,所以初始取col为根号n,只有$n $%$ col != 0$,col就递加,从而获取列col和行row。 - 2、填充矩阵
这里采纳设置矩阵的4个边界(左右高低),别离为$left=0,right=col-1,up=0,bottom=row-1$,依照从左到右,从上到下,从右到左,从下到上的程序顺次填充,每一次填充结束就更新边界,比方依照从左往右填充了一行就更新上边界up(++up),只有每次填充结束后,index>=n,阐明填充完结。
提交后果
AC代码
#include <cstdio>#include <cmath>#include <iostream>#include <algorithm>using namespace std;int main() { int n; scanf("%d", &n); int a[n]; for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } sort(a, a + n, [&](int a, int b) { return a > b; }); // 计算m和n int col = (int) sqrt(n * 1.0); while (n % col != 0) { --col; } int row = n / col; int result[row][col]; int index = 0;// 标记以后填充的元素 // 定义数组的左右高低边界 int left = 0, right = col - 1, up = 0, bottom = row - 1; while (index < n) { // 从左到右 for (int i = left; i <= right; ++i) { result[up][i] = a[index++]; } // 更新上界 ++up; if (index >= n) break; // 从上到下 for (int i = up; i <= bottom; ++i) { result[i][right] = a[index++]; } // 更新右边界 --right; if (index >= n) break; // 从右到左 for (int i = right; i >= left; --i) { result[bottom][i] = a[index++]; } // 更新下界 --bottom; if (index >= n) break; // 从下到上 for (int i = bottom; i >= up; --i) { result[i][left] = a[index++]; } // 更新左边界 ++left; } for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { printf("%d", result[i][j]); if (j < col - 1) printf(" "); } printf("\n"); } return 0;}