pat乙级1050C语言

先知道最小差值的x,y,然后判断右下左上这样一个循环,最后按照循环圈赋值,最后输出

#include
#include
#include

int cmp(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}

int main()
{
    int N=0;
    scanf("%d",&N);
    int a[N],cha=N,x=0,y=0;
    for(int i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    qsort(a,N,sizeof(int),cmp);
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=i;j++)
        {
            if(i*j==N&&i-j<cha)
            {
                cha=i-j;
                x=i;
                y=j;
            }
        }
    }
    int b[x][y];
    memset(b,0,sizeof(b));
    int i=0,j=0,count=0;
    b[i][j]=a[count++];
    while(count<N)
    {
        while(i+1<y&&!b[j][i+1])
        {
            b[j][++i]=a[count++];
        }
        while(j+1<x&&!b[j+1][i])
        {
            b[++j][i]=a[count++];
        }
        while(i-1>=0&&!b[j][i-1])
        {
            b[j][--i]=a[count++];
        }
        while(j-1>=0&&!b[j-1][i])
        {
            b[--j][i]=a[count++];
        }
    }
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            if(j!=0)
            {
                printf(" ");
            }
            printf("%d",b[i][j]);
        }
        printf("\n");
    }
}

第二遍刷,加了注释

#include
#include
#include
int cmp(const void *a,const void *b)//快速排序
{
    return *(int *)b-*(int *)a;
}

int main()
{
    int n,x,y,k=0;//n是输入的元素个数,x存储最小差的列值,y存储最小差的行值
    scanf("%d",&n);
    int min=n;//min存储最小的差,来比较行列最小差值的矩阵
    for(int i=1;i<=n;i++)//双重for循环找出最小的x列y行的矩阵
    {
        for(int j=i;j<=n;j++)
        {
            if(i*j==n&&j-i<min)
            {
                min=j-i;
                x=i;
                y=j;
            }
        }
    }
    int b[y][x],a[n];
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++)//输入n个数
    {
        scanf("%d",&a[i]);
    }
    qsort(a,n,sizeof(int),cmp);//快速排序
    int i=0,j=0;
    b[i][j]=a[k++];
    while(k<n)
    {
        while(j+1<x&&!b[i][j+1]) b[i][++j]=a[k++];
        while(i+1<y&&!b[i+1][j]) b[++i][j]=a[k++];
        while(j-1>=0&&!b[i][j-1]) b[i][--j]=a[k++];
        while(i-1>=0&&!b[i-1][j]) b[--i][j]=a[k++];
    }
    for(int i=0;i<y;i++)
    {
        for(int j=0;j<x;j++)
        {
            if(j==0)
            {
                printf("%d",b[i][j]);
            }
            else
            {
                printf(" %d",b[i][j]);
            }
        }
        printf("\n");
    }
}

你可能感兴趣的:(pat考试,pat)