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

来源:互联网 发布:小学生笔顺软件下载 编辑:程序博客网 时间:2024/05/20 19:47

1050. 螺旋矩阵(25)

本题要求将给定的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
这道题先是一个简单的排序,后面是按照题目意思来的矩阵排列。这里个人也没什么好的建议,就是慢慢调试,我真的第一次做的时候根据输出调试了好多次。当时做这道题,电脑还有点问题1000*1000的矩阵都定义不出来,只能先用10*10的,最后调试好了才在交的时候改了数据,一把辛酸泪。这是我的代码:
#include<stdio.h>#include<math.h>int main(void){    int N,m,n;    static int a[10000];    static int b[10000][10000];    int i,j,max,s=0;    scanf("%d",&N);    n=sqrt(N);    while(N%n!=0)    {        n--;    }    if (N/n>n) m=N/n;    else    {        n=N/n;m=N/n;    }    for (i=0;i<N;i++)    {        scanf("%d",&a[i]);    }    for (i=0;i<N;i++)                                           //从大到小排序    {        max=i;        for (j=i+1;j<N;j++)        {            if (a[j]>a[max]) max=j;        }        j=a[i];a[i]=a[max];a[max]=j;    }    i=0;j=0;    do    {        do        {            b[i][j]=a[s];            s++;j++;        }while(j<n && b[i][j]==0);        j--;s--;        do        {            b[i][j]=a[s];            s++;i++;        }while(i<m && b[i][j]==0);        i--;s--;        do        {            b[i][j]=a[s];            s++;        }while(b[i][--j]==0 && j>=0);        j++;s--;        do        {            b[i][j]=a[s];            s++;        }while(b[--i][j]==0 && i>=0);        i++;s--;    }while(s<N-1);    for (i=0;i<m;i++)    {        for (j=0;j<n;j++)        {            if (j!=0) printf(" ");            printf("%d",b[i][j]);        }        printf("\n");    }    return 0;}


原创粉丝点击