Soy demasiado inteligente, no puedo escribir esta pregunta, me refiero al método de controlar los límites en el libro.
#include <cstdio>
#include <algorithm>
using namespace std;
bool cmp(int a, int b){
return a > b;
}
int main(){
int N;
scanf("%d", &N);
int m, n;
for(int i=1; i<=N; i++){
if(N % i == 0){
m = i;
n = N / m;
if(m >= n) break;
}
}
int seq[N];
for(int i=0; i<N; i++){
scanf("%d", &seq[i]);
}
if(N == 1){
printf("%d", seq[0]);
return 0;
}
sort(seq, seq+N, cmp);
int arr[m+1][n+1];
int i = 1, j = 1, now = 0;
int U = 1, D = m, L = 1, R = n;
while(now != N){
while(now!=N && j<R){
arr[i][j] = seq[now++];
j++;
}
while(now!=N && i<D){
arr[i][j] = seq[now++];
i++;
}
while(now!=N && j>L){
arr[i][j] = seq[now++];
j--;
}
while(now!=N && i>U){
arr[i][j] = seq[now++];
i--;
}
U++;D--;L++;R--;
i++;j++;
if(now == N-1){
arr[i][j] = seq[now++];
}
}
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
printf("%d", arr[i][j]);
if(j != n) printf(" ");
}
printf("\n");
}
return 0;
}