https://www.patest.cn/contests/pat-a-practise/1105
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <functional>
int dir[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };
int N,m, n,map[1001][1001],a[1000001];
bool myGreater(int a, int b) {
return a > b;
}
int main()
{
scanf("%d",&N);
m = (int)sqrt(N);
while (1) {
if (N%m == 0) {
n = N / m;
break;
}
m++;
}
if (n>m) std::swap(m, n);
for (int i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
std::sort(a, a + N, myGreater);
int curDir = 0, x=0,y=0;
int l = 0, r = n - 1, u = 0, b = m - 1;
for (int i = 0; i < N; i++)
{
map[x][y] = a[i];
if (y + dir[curDir][1] > r) {
curDir = 1;
u++;
}
if (x + dir[curDir][0]> b) {
curDir = 2;
r--;
}
if (y +dir[curDir][1]< l) {
curDir = 3;
b--;
}
if (x + dir[curDir][0] < u) {
curDir = 0;
l++;
}
x += dir[curDir][0];
y += dir[curDir][1];
}
for (int i = 0; i < m; i++)
{
printf("%d", map[i][0]);
for (int j = 1; j < n; j++)
{
printf(" %d", map[i][j]);
}
printf("\n");
}
return 0;
}