Result: Accepted
Time: 68ms
Memory: 6108kB
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <set>
#include <string>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <deque>
#define clr(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int maxn=1e4+10;
int t,n;
int a[maxn],ans[maxn][110];
int main()
{
scanf("%d",&t);
while(t--)
{
clr(ans,0),clr(a,0);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+1+n);
//定几行几列
int x=n,y=1;
for(int i=2;i<=sqrt(n*1.0);i++)//列举y
{
if(n%i==0)
{
x=n/i;
y=i;
}
}
//填充
int now=n,dx=1,dy=0,p=0;
while(1)
{
while(dy+1<=y-p&&!ans[dx][dy+1])//right
{
ans[dx][++dy]=a[now];
now--;
if(!now)break;
}
if(!now)break;
while(dx+1<=x-p&&!ans[dx+1][dy])//down
{
ans[++dx][dy]=a[now];
now--;
if(!now)break;
}
if(!now)break;
while(dy-1>=1+p&&!ans[dx][dy-1])//left
{
ans[dx][--dy]=a[now];
now--;
if(!now)break;
}
if(!now)break;
while(dx-1>=1+p&&!ans[dx-1][dy])//up
{
ans[--dx][dy]=a[now];
now--;
if(!now)break;
}
p++;
if(!now)break;
}
for(int i=1;i<=x;i++)
{
int k=0;
for(int j=1;j<=y;j++)
{
if(k)printf(" ");
printf("%d",ans[i][j]);
k=1;
}
printf("\n");
}
printf("\n");
}
}