首页 > 代码库 > 1050. 螺旋矩阵(25)

1050. 螺旋矩阵(25)

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

输入格式:

输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。

输入样例:

1237 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 9342 37 8153 20 7658 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);//323     min = n;24     for(i = 1;i <= sqrt(n);i++)25     {26         if(n%i == 0)27             h = i;28     }//找到满足条件 差最小的数 29     l = n/h;//430     int b[l][h];  //  4 331 //    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 = 039         while(i < l-1 && b[i+1][j] == 0)40             b[++i][j] = a[k++];//i = 3,j = 241         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)