本题要求将给定的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 }