5057: 螺旋矩阵

描述

 

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

输入

 

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

输出

 

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

样例输入

样例输出

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,m,num,jishu;
 4 int arr[1010][1010];
 5 vector<int> vec;
 6 bool cmp(int a,int b){
 7     return a>b;
 8 }
 9 int main()
10 {
11     cin>>num;
12     for(int i=sqrt(num);i>=1;i--){
13         if(num%i==0){
14             n=max(num/i,i);
15             m=min(num/i,i);
16             break;
17         }
18     }
19     for(int i=1,d;i<=num;i++){
20         cin>>d;
21         vec.push_back(d);
22     }
23     sort(vec.begin(),vec.end(),cmp);
24     int t=n/2+n%2;
25     jishu=0;
26     for(int i=0;i<t;i++){
27         for(int j=i;j<=m-i-1&&jishu<num;j++){
28             arr[i][j]=vec[jishu++];
29         }
30         for(int j=i+1;j<=n-i-1&&jishu<num;j++){
31             arr[j][m-i-1]=vec[jishu++];
32         }
33         for(int j=m-i-2;j>=i&&jishu<num;j--){   //不实现
34             arr[n-i-1][j]=vec[jishu++];
35         }
36         for(int j=n-i-2;j>=i+1&&jishu<num;j--){
37             arr[j][i]=vec[jishu++];
38         }
39     }
40     for(int i=0;i<n;i++)
41     for(int j=0;j<m;j++){
42         if(j!=0) cout << " ";
43         cout << arr[i][j];
44         if(j==m-1){
45             cout << endl;
46         }
47     }
48     return 0;
49 }
View Code
原文地址:https://www.cnblogs.com/qq-1585047819/p/10872261.html