1050. 螺旋矩阵(25)

1050. 螺旋矩阵(25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

本题要求将给定的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

螺旋,即选用四个参数标定上下左右的极值,用ij遍历。

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=10001;
int b[maxn][maxn];    int a[maxn];   因为太大了 不能放在主函数里  放在外面就对了  里面b[10001][10001]会因为太大,而出错。

bool cmp(int a,int b){
    return a>b;
}
int main(){
    int N;
    scanf("%d",&N);
    int k=sqrt(N);
    for(int i=k;i>=1;i--){
        if(N%i==0){k=i;break;}
    }
    int m,n;
    n=k;
    m=N/k;

    for(int i=0;i<N;i++){
        scanf("%d",&a[i]);
    }
    sort(a,a+N,cmp);

    int t=0,i=0,j=0;
    int you=n-1,xia=m-1,zuo=0,shang=0;
    while(t<N){
        while(i<=you){
            b[j][i]=a[t];
        //    printf("%d %d %d\n",b[j][i],j,i);
            t++;i++;
        }
        if(t==N){break;}
        shang++;j++;i--;
        while(j<=xia){
            b[j][i]=a[t];
        //    printf("%d %d %d\n",b[j][i],j,i);
            t++;j++;
        }
        if(t==N){break;}
        you--;i--;j--;
        while(i>=zuo){
            b[j][i]=a[t];
       //     printf("%d %d %d\n",b[j][i],j,i);
            t++;i--;
        }
        if(t==N){break;}
        xia--;j--;i++;
        while(j>=shang){
            b[j][i]=a[t];
      //      printf("%d %d %d\n",b[j][i],j,i);
            t++;j--;
        }
        if(t==N){break;}
        zuo++;i++;j++;
    }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            printf("%d",b[i][j]);
            if(j!=n-1){
                printf(" ");
            }else{
                printf("\n");
            }
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_37680278/article/details/79950892
今日推荐