描述
本题要求将给定的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 }