1050 螺旋矩陣 (25 分)
阿新 • • 發佈:2018-11-01
本題要求將給定的 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
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N,n,m;
int a[10001];
cin>>N;
for(int i=0; i<N; i++)
{
cin>>a[i];
}
n=sqrt(N);
while(N%n)n--;
m=N/n;
int s[m][n];
sort(a,a+ N);
int t=N-1,x=0;
for(; x*2<n; x++)
{
for(int i=x; i<n-x; i++)
{
s[x][i]=a[t--];
}
for(int i=x+1; i<m-x; i++)
{
s[i][n-1-x]=a[t--];
}
for(int i=n-x-2; i>=x; i--)
{
s[m-1-x][i]= a[t--];
}
if(n-1-x>x)
{
for(int i=m-x-2; i>=x+1; i--)
{
s[i][x]=a[t--];
}
}
}
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(j!=0)cout<<" ";
cout<<s[i][j];
}
cout<<endl;
}
}