PAT1050 螺旋矩阵

本题要求将给定的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
这个题非常综合,考试中估计是比较难拿满分的,特别是花矩阵的方法不是完全对称的画,会出现很多细节问题,思路已经写在代码注释中了
下面是AC代码
 
   
#include 
#include 
#include 
int cmp(const void *a,const void *b) //快排
{
    int *aa = (int *)a;
    int *bb = (int *)b;
    return *bb - *aa;
}
int main()
{
    int N;
    int m,n,k=0;
    int tmp;
    scanf("%d",&N);
    int *a = (int *)malloc(sizeof(int)*N);
    int **s;
    int i,j,q;

    //得到 m,n
    m = sqrt(N);
    while(N % m != 0)
    {
        m++;
    }
    n = N / m;
    if(n > m)
    {
        tmp = m;
        m = n;
        n = tmp;
    }

    //为一个二维数组 s 动态分配内存
    s=(int**)malloc(sizeof(int*)*(m+1));
    for(i=0;i	
    for(i=0;k矩阵是按顺时针一圈一圈往里画的,先画上边
        {
            s[i][j] = a[k];
            k++;
        }
        if(k == N)    //k=N时停止循环,下面同理
            break;
        for(q=i+1;q=i;j--)   //画下边,右到左
        {
            s[m-i-1][j] = a[k];
            k++;
        }
        if(k == N)
            break;
        for(q=m-i-2;q>i;q--)     //画左边,下到上
        {
            s[q][i] = a[k];
            k++;
        }
    }

    for(i=0;i



你可能感兴趣的:(PAT,Basic)