码迷,mamicode.com
首页 > 其他好文 > 详细

1050. 螺旋矩阵(25)

时间:2018-03-07 10:34:36      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:oid   规模   scan   数字   com   image   填充   class   ++   

本题要求将给定的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("\n");
48     }
49     return 0;
50 }

 

1050. 螺旋矩阵(25)

标签:oid   规模   scan   数字   com   image   填充   class   ++   

原文地址:https://www.cnblogs.com/yuxiaoba/p/8520350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!