1050. 螺旋矩阵(25)
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求将给定的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<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
return x>y;
}
int N,m,n,idx,A[10005],G[10005][10005];
void Get_mn(int N){ //获取m和n
m = N;
n = 1;
for(int i=N;i>0;--i){
int j=N/i;
if(i<j) return;
if(i*j!=N) continue;
if(i-j<m-n){ //更新
m = i;
n = j;
}
}
}
void Init(){ //初始化
Get_mn(N); //获取m和n
for(int i=0;i<=m+1;++i) //左右两边设墙
G[i][0] = G[i][n+1] = -2;
for(int i=0;i<=n+1;++i) //上下两遍边设墙
G[0][i] = G[m+1][i] = -2;
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j) //中间初始化为-1
G[i][j] = -1;
}
}
void FillIn(int row,int col){ //填充
int i=row,j=col;
if(G[i][j]!=-1) return; //全部填充完
if(G[i-1][j]!=-1 && G[i][j-1]!=-1){ //在左上角,往右填充
while(G[i][j]==-1){
G[i][j] = A[idx++];
++j;
}
++i;--j;
}
else if(G[i-1][j]!=-1 && G[i][j+1]!=-1){ //在右上角,往下填充
while(G[i][j]==-1){
G[i][j] = A[idx++];
++i;
}
--i;--j;
}
else if(G[i+1][j]!=-1 && G[i][j+1]!=-1){ //在右下角,往左填充
while(G[i][j]==-1){
G[i][j] = A[idx++];
--j;
}
--i;++j;
}
else{ //在左下角,往上填充
while(G[i][j]==-1){
G[i][j] = A[idx++];
--i;
}
++i;++j;
}
FillIn(i,j); //递归填充
}
int main(){
scanf("%d",&N);
for(int i=0;i<N;++i)
scanf("%d",&A[i]);
sort(A,A+N,cmp);
Init(); //初始化
FillIn(1,1); //填充
for(int i=1;i<=m;++i){
for(int j=1;j<=n-1;++j)
printf("%d ",G[i][j]);
printf("%d\n",G[i][n]);
}
return 0;
}