题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608
确认过了,是我不会写的题。。

代码

代码参考算法笔记

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn = 10010;
  6. int matrix[maxn][maxn], a[maxn]; // 必须要在函数外面定义
  7. bool cmp(int a, int b){
  8. return a > b;
  9. }
  10. int main(){
  11. int N;
  12. scanf("%d", &N);
  13. for(int i = 0; i < N; i++){
  14. scanf("%d", &a[i]);
  15. }
  16. if(N == 1){
  17. printf("%d", a[0]);
  18. return 0;
  19. }
  20. sort(a, a + N, cmp);
  21. int m = (int)ceil(sqrt(1.0 * N));
  22. while(N % m != 0) m++;
  23. int n = N / m, i = 1, j = 1, now = 0; // i、j是从1开始
  24. int U = 1, D = m, L = 1, R = n; // U D L R 的数字注意一下
  25. while(now < N){
  26. while(now < N && j < R){
  27. matrix[i][j] = a[now++];
  28. j++;
  29. }
  30. while(now < N && i < D){
  31. matrix[i][j] = a[now++];
  32. i++;
  33. }
  34. while(now < N && j > L){
  35. matrix[i][j] = a[now++];
  36. j--;
  37. }
  38. while(now < N && i > U){
  39. matrix[i][j] = a[now++];
  40. i--;
  41. }
  42. U++, D--, L++, R--; // 缩圈
  43. i++, j++; // 位置移到内圈左上角
  44. if(now == N - 1){ // 最后一个数单独处理
  45. matrix[i][j] = a[now++];
  46. }
  47. }
  48. for(int i = 1; i <= m; i++){ // 都是从1 到 m
  49. for(int j = 1; j <= n; j++){
  50. printf("%d", matrix[i][j]);
  51. if(j != n) printf(" ");
  52. }
  53. printf("\n");
  54. }
  55. return 0;
  56. }