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<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
int hang,lie;
int b[10001][10001]={0};
bool cmp(int x,int y)
{
return x>y;
}
int calLieShu(int k)
{
int Max;
for(int i=1;i<=sqrt(k);i++)
{
if(k%i==0) Max=i;
}
return Max;
}
bool leagl(int x,int y)
{
if(x<1||x>hang||y>lie||y<1)
return false;
return true;
}
struct node
{
int x,y;
};
int a[100001];
int main()
{
node cur,next;
int n;
scanf("%d",&n);
int j=1;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
lie=calLieShu(n);
hang=n/lie;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
cur.x=1;
cur.y=1;
b[cur.x][cur.y]=a[0];
while(j<n)
{
for(int i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
while(leagl(next.x,next.y)&&b[next.x][next.y]==0)
{
cur=next;
b[cur.x][cur.y]=a[j++];
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
}
}
}
for(int i=1;i<=hang;i++)
{
for(int j=1;j<=lie;j++)
{
if(j!=lie)
printf("%d ",b[i][j]);
else printf("%d",b[i][j]);
}
putchar(10);
}
return 0;
}