#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[10001];
cin>>n;
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
int mm=sqrt(1.0*n),nn;
for(int i=mm; i<=n; i++) {
if(n%i==0) {
mm=i;
nn=n/mm;
break;
}
}
if(nn>mm)swap(mm,nn);
int data[mm][nn];
int cnt=n-1;
int i=0,j=-1,q=0;
while(cnt>=0) {
while(j+1<nn-q&&cnt>=0) {
j++;
data[i][j]=a[cnt--];
}
while(i+1<mm-q&&cnt>=0) {
i++;
data[i][j]=a[cnt--];
}
while(j-1>q-1&&cnt>=0) {
j--;
data[i][j]=a[cnt--];
}
while(i-1>q&&cnt>=0) {
i--;
data[i][j]=a[cnt--];
}q++;
}
for(int i=0; i<mm; i++) {
for(int j=0; j<nn; j++) {
if(j!=0)putchar(' ');
printf("%d",data[i][j]);
}
printf("\n");
}
return 0;
}
要注意:mm,nn的求值。
1、用ceiling.
2、swap.
3、直接先求n.