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

螺旋数组的意思是这样子

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 int ans[10002][10002];
 6 int a[10002];
 7 int cmp( const void *a, const void *b)
 8 {
 9     return *(int *)b -*( int *)a;
10 }
11 int main()
12 {
13     int N,r,c,min=999999;
14     int i,j,k;
15     scanf("%d",&N);
16     for( i=0; i<N; i++)
17         scanf("%d",&a[i]);
18     qsort( a, N,sizeof( a[1]),cmp);  //降序排列
19     int n = (int )sqrt(N*1.0);  
20     for( i=1; i<=n; i++) //i循环表示列数,行数大于列数,只需循环N的开方次
21     {
22         if( N%i==0 && (N/i-i < min) )
23         {
24             min = N/i-i;
25             r = i; //r列
26         }
27     }
28     c = N/r;  //c行
29     ans[0][0]=a[0];  //初始化第一位数
30     i=j=k=0;
31     while( k<N-1)
32     {
33         while( j+1<r && !ans[i][j+1]) //向左
34             ans[i][++j] = a[++k];
35         while( i+1<c && !ans[i+1][j]) //向下
36             ans[++i][j] = a[++k];
37         while(j-1>=0 && !ans[i][j-1])//向右
38             ans[i][--j] = a[++k];
39         while( i-1>=0 && !ans[i-1][j]) //向上
40             ans[--i][j] = a[++k];
41     }
42     for( i=0; i<c; i++)
43     {
44         printf("%d",ans[i][0]);
45         for( j=1; j<r; j++)
46             printf(" %d",ans[i][j]);
47         printf("
");
48     }
49     return 0;
50 }

在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
原文地址:https://www.cnblogs.com/yuxiaoba/p/8520350.html