pat1050乙螺旋矩阵

1050 螺旋矩阵 (25 分)https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10
​4
​​,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 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

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b){return a>b;}
int main(){
   int N,m,n,t=0;
   cin>>N;
   int a[N];
   for(int i=0;i<N;i++){
    cin>>a[i];
   }
   for(n=sqrt(N);n>=1;n--){
    if(N%n==0){
        m=N/n;
        break;
    }
   }
   sort(a,a+N,cmp);
   int b[m][n];
   int level=m/2+m%2;
   for(int i=0;i<level;i++){
    for(int j=i;j<n-i&&t<N;j++){
        b[i][j]=a[t++];
    }
    for(int j=i+1;j<m-1-i&&t<N;j++){
        b[j][n-1-i]=a[t++];
    }
    for(int j=n-1-i;j>=i&&t<N;j--){
        b[m-i-1][j]=a[t++];
    }
    for(int j=m-i-2;j>i&&t<N;j--)
        b[j][i]=a[t++];
   }
   for(int i=0;i<m;i++){
     for(int j=0;j<n;j++){
        printf("%d",b[i][j]);
        if(j!=n-1)printf(" ");
    }
    printf("\n");
   }
   return 0;

}
posted on 2021-03-09 08:58  小明很萌  阅读(26)  评论(0)    收藏  举报