将序列从大到小排序,逆时针蛇形排列成一个矩阵
确认矩阵的行和列,从sqrt开始依次尝试
之后按照四个方向填充矩阵即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10010;
int n0;
int a[N];
int M[N][N]={0};
int cmp(const int a,const int b) {return a>b;}
void fillMatrix(int m,int n) {
int cnt=0;
int face=0;
int pox=0;
int poy=0;
int z1=0;
int z2=1;
while (cnt<n0) {
M[pox][poy]=a[cnt];
int xx=pox+z1;
int yy=poy+z2;
if (!(xx<m && xx>=0 && yy<n && yy>=0 && !M[xx][yy])) {
face=(face+1)%4;
if (face==0) {
z1=0;
z2=1;
}
else if (face==1) {
z1=1;
z2=0;
}
else if (face==2) {
z1=0;
z2=-1;
}
else {
z1=-1;
z2=0;
}
}
pox+=z1;
poy+=z2;
++cnt;
}
}
int main()
{
scanf("%d",&n0);
for (int i=0;i<n0;++i) scanf("%d",&a[i]);
sort(a,a+n0,cmp);
//m>=n
int n=(int)sqrt((double)n0);
while (n0%n!=0) n--;
int m=n0/n;
fillMatrix(m,n);
for (int i=0;i<m;++i) {
for (int j=0;j<n;++j) {
printf("%d",M[i][j]);
if (j<n-1) printf(" ");
}
printf("\n");
}
return 0;
}