PAT乙级 1050. 螺旋矩阵(25)

来源:互联网 发布:淘宝实名账号购买 编辑:程序博客网 时间:2024/05/20 18:15

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个空格分隔,行末不得有多余空格。

输入样例:
1237 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 9342 37 8153 20 7658 60 76


#include<iostream>#include<cmath>#include<algorithm>#include<cstdio>using namespace std;int hang,lie;int b[10001][10001]={0};bool cmp(int x,int y){    return x>y;}int calLieShu(int k){    int Max;    for(int i=1;i<=sqrt(k);i++)    {        if(k%i==0) Max=i;    }    return Max;}bool leagl(int x,int y){    if(x<1||x>hang||y>lie||y<1)    return false;    return true;}struct node{    int x,y;};int a[100001];int main(){    node cur,next;    int n;    scanf("%d",&n);    int j=1;    for(int i=0;i<n;i++)        scanf("%d",&a[i]);        sort(a,a+n,cmp);    lie=calLieShu(n);    hang=n/lie;    int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};    cur.x=1;    cur.y=1;    b[cur.x][cur.y]=a[0];    while(j<n)    {       for(int i=0;i<4;i++)    {        next.x=cur.x+dir[i][0];        next.y=cur.y+dir[i][1];        while(leagl(next.x,next.y)&&b[next.x][next.y]==0)        {            cur=next;            b[cur.x][cur.y]=a[j++];            next.x=cur.x+dir[i][0];            next.y=cur.y+dir[i][1];        }    }    }    for(int i=1;i<=hang;i++)    {        for(int j=1;j<=lie;j++)        {            if(j!=lie)            printf("%d ",b[i][j]);            else printf("%d",b[i][j]);        }        putchar(10);    }    return 0;}


原创粉丝点击