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 } 
原文地址:https://www.cnblogs.com/lolybj/p/6253631.html