简单模拟
//
// main.cpp
// PATA1105
//
// Created by Phoenix on 2018/2/23.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 10010;
int num[maxn];
bool cmp(int a, int b) {
return a > b;
}
int main(int argc, const char * argv[]) {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
sort(num, num + n, cmp);
int p = sqrt(n), q = sqrt(n);
while (p * q != n) {
if (p * q < n) {
p++;
} else if(p * q > n) {
q--;
}
}
int G[p][q], k = 0;
for(int i = 0; i < q / 2; i++) {
for(int j = i; j < q - i; j++) {
G[i][j] = num[k++];
}
for(int j = i + 1; j < p - i - 1; j++) {
G[j][q - i - 1] = num[k++];
}
for(int j = q - i - 1; j > i; j--) {
G[p - i - 1][j] = num[k++];
}
for(int j = p - i - 1; j > i; j--) {
G[j][i] = num[k++];
}
}
if(q % 2 == 1) {
for(int i = q / 2; i < p - q / 2; i++) {
G[i][q / 2] = num[k++];
}
}
for(int i = 0; i < p; i++) {
for(int j = 0; j < q; j++) {
printf("%d", G[i][j]);
if(j < q - 1) printf(" ");
else printf("\n");
}
}
return 0;
}