题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608
确认过了,是我不会写的题。。
代码
代码参考算法笔记
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int maxn = 10010;int matrix[maxn][maxn], a[maxn]; // 必须要在函数外面定义bool cmp(int a, int b){return a > b;}int main(){int N;scanf("%d", &N);for(int i = 0; i < N; i++){scanf("%d", &a[i]);}if(N == 1){printf("%d", a[0]);return 0;}sort(a, a + N, cmp);int m = (int)ceil(sqrt(1.0 * N));while(N % m != 0) m++;int n = N / m, i = 1, j = 1, now = 0; // i、j是从1开始int U = 1, D = m, L = 1, R = n; // U D L R 的数字注意一下while(now < N){while(now < N && j < R){matrix[i][j] = a[now++];j++;}while(now < N && i < D){matrix[i][j] = a[now++];i++;}while(now < N && j > L){matrix[i][j] = a[now++];j--;}while(now < N && i > U){matrix[i][j] = a[now++];i--;}U++, D--, L++, R--; // 缩圈i++, j++; // 位置移到内圈左上角if(now == N - 1){ // 最后一个数单独处理matrix[i][j] = a[now++];}}for(int i = 1; i <= m; i++){ // 都是从1 到 mfor(int j = 1; j <= n; j++){printf("%d", matrix[i][j]);if(j != n) printf(" ");}printf("\n");}return 0;}
