• PAT 1050. 螺旋矩阵(25)


    本题要求将给定的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
    
    本题主要解决两个问题,一个是如何确定n,m的值,再就是如何画矩阵。
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<ctype.h>
     5 #include<math.h>
     6 int b[10010][10010];
     7 int cmp(const void *a,const void *b){
     8     return *(int*)b-*(int*)a; 
     9 }
    10 int main(){
    11     int N;
    12     int a[10010];
    13     scanf("%d",&N);
    14     for(int i=0;i<N;i++){
    15         scanf("%d",&a[i]);
    16     }
    17     int n = (int)sqrt(N);
    18     while(N%n!=0){
    19         n--;
    20     }
    21     int m = N/n;
    22     qsort(a,N,sizeof(a[0]),cmp);
    23     int n1=n,m1=m;
    24     int i = 0,j=0;
    25     int k = 0;
    26     int h = 0;
    27 
    28         
    29     while(k<N){
    30         
    31         while(j<n){
    32             b[i][j] = a[k++];
    33             j++;
    34         }
    35         if(k==N)
    36             break;
    37         j--;
    38         k--;
    39         while(i<m){
    40             b[i][j] = a[k++];
    41             i++;
    42         }
    43         if(k==N)
    44             break;
    45         i--;
    46         k--;
    47         while(j>=h){
    48             b[i][j] = a[k++];
    49             j--;
    50         }
    51         if(k==N)
    52             break;
    53         j++;
    54         k--;
    55         while(i>h){
    56             b[i][j] = a[k++];
    57             i--;
    58         }
    59         if(k==N)
    60             break;
    61         i++;
    62         n--;
    63         m--;
    64         k--;
    65         h++;
    66     }
    67     for(i=0;i<m1;i++){
    68         for(j=0;j<n1-1;j++){
    69             printf("%d ",b[i][j]);
    70         }
    71         printf("%d
    ",b[i][j]);
    72     }
    73 } 
  • 相关阅读:
    排列 [计数dp]
    排列 [计数dp]
    函数 [计数]
    多态
    继承2
    2018年蓝桥杯b组国赛真题
    c++的继承
    运算符2
    运算符重载
    拷贝构造
  • 原文地址:https://www.cnblogs.com/lolybj/p/6253631.html
Copyright © 2020-2023  润新知