1050. 螺旋矩阵(25)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

code:
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 
 6 int cmp(const void *a,const void *b)
 7 {
 8     return *(int *)b-*(int *)a;
 9 }
10 
11 int main()
12 {
13     int n,i,j,k,h,l,min;
14     int a[10001];
15     scanf("%d",&n);
16     getchar();
17     for(i = 0;i < n;i++)
18     {
19         scanf("%d",&a[i]);        
20     }
21     qsort(a,n,sizeof(a[0]),cmp);
22     h = sqrt(n);//3
23     min = n;
24     for(i = 1;i <= sqrt(n);i++)
25     {
26         if(n%i == 0)
27             h = i;
28     }//找到满足条件 差最小的数 
29     l = n/h;//4
30     int b[l][h];  //  4 3
31 //    printf("%d %d",l,h);
32     memset(b,0,sizeof(b));
33     i  = 0,j = 0,k = 0;
34     b[0][0] = a[k++];//先对第一个数赋值,不然后面不好计算 
35     while(k < n)
36     {
37         while(j < h-1 && b[i][j+1] == 0)
38             b[i][++j] = a[k++];//j = 2,i = 0
39         while(i < l-1 && b[i+1][j] == 0)
40             b[++i][j] = a[k++];//i = 3,j = 2
41         while(j > 0 && b[i][j-1] == 0)
42             b[i][--j] = a[k++];//i = 3,j = 0 
43         while(i > 0 && b[i-1][j] == 0)
44             b[--i][j] = a[k++];
45     }
46     for(i = 0;i < l;i++)
47     {
48         for(j = 0;j < h;j++)
49         {
50             if(j != 0)
51                 printf(" ");
52             printf("%d",b[i][j]);    
53         }
54         printf("\n");
55     }
56     
57     return 0;     
58 } 

 

以上是关于1050. 螺旋矩阵(25)的主要内容,如果未能解决你的问题,请参考以下文章

PTA乙级(*1050 螺旋矩阵 (25分))

1050. 螺旋矩阵(25)

PAT Basic 1050 螺旋矩阵 (25 分)

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

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

1050 螺旋矩阵 (25分)