考查点:模拟题,蛇形填数
思路:这里经过四个循环后除了更新边界外还必须i++,j++,进入内层,以后模拟时不能只停在一个循环,应该第二层循环,第二是中间数的处理,对于正方形中间数必须在过四个循环之后单独处理,即在最后赋值给中间位置
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i <= y; i++)
#define rFOR(i, x, y) for(int i = x; i >= y; i--)
#define MAXN 10010
#define oo 0x3f3f3f3f
using namespace std;
int a[MAXN];
int ans[MAXN][MAXN];
bool cmp(int a,int b){
return a>b;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int N;
cin>>N;
FOR(i,0,N-1)
scanf("%d",&a[i]);
if(N==1){
printf("%d",a[0]);return 0;
}
sort(a,a+N,cmp);
int n,m;
m=(int)ceil(sqrt(1.0*N));
while(N%m!=0){
m++;
}
n=N/m;
int cnt=0;
int i=0,j=0;
int L=1,R=n-1,U=1,D=m-1;
while(cnt<N){
while(cnt<N&&j<R){
ans[i][j++]=a[cnt++];
}
R--;
while(cnt<N&&i<D){
ans[i++][j]=a[cnt++];
}
D--;
while(cnt<N&&j>=L){
ans[i][j--]=a[cnt++];
}
L++;
while(cnt<N&&i>=U){
ans[i--][j]=a[cnt++];
}
U++;
j++;
i++;
if(cnt==N-1)ans[i][j]=a[cnt++];
}
FOR(i,0,m-1)
FOR(j,0,n-1)
{
printf("%d",ans[i][j]);
if(j<n-1){
printf(" ");
}else printf("\n");
}
return 0;
}