1050. 螺旋矩阵(25)

时间限制
150 ms
内存限制
65536 kB

本题要求将给定的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<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int N,m,n;
 5 
 6 bool cmp(int a,int b){
 7     return a>b;
 8 }
 9 int main(){
10     cin>>N;
11     for(int t=sqrt(N);t>0;t--){
12         if(N%t==0){
13             n=t;
14             m=N/t;
15             break;
16         }
17     }
18     int a[N+5]={},b[m+5][n+5]={};
19     for(int i=0;i<N;i++) scanf("%d",&a[i]);
20     sort(a,a+N,cmp);
21     
22     int i=0,j=0;
23     b[0][0]=a[0];//第一个点 
24     for(int cnt=1;cnt<N;){
25         while(j+1<n&&!b[i][j+1]) b[i][++j]=a[cnt++];//向右 
26         while(i+1<m&&!b[i+1][j]) b[++i][j]=a[cnt++];//向下 
27         while(j-1>=0&&!b[i][j-1]) b[i][--j]=a[cnt++];//向左 
28         while(i-1>=0&&!b[i-1][j]) b[--i][j]=a[cnt++];//向上 
29     }
30     
31     for(int i=0;i<m;i++){
32         printf("%d",b[i][0]);
33         for(int j=1;j<n;j++)
34             printf(" %d",b[i][j]);
35         printf("\n");
36     }
37     return 0;
38 }

 

 posted on 2018-03-17 14:16  theFresh  阅读(196)  评论(0编辑  收藏  举报