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