Note
- 快乐模拟
- 注意i代表行!!!j代表列!!!
不要写反了(我可真行==
Code:
#include<bits/stdc++.h>
using namespace std;
int n;
int findFac(){
vector<int> fac;
int mini=1e8,best;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0) fac.push_back(i);
}
for(int i=fac.size()-1;i>=0;i--){
int a=fac[i],b=n/fac[i];
if(a<b) swap(a,b);
if(a-b<mini){
best=a;
mini=a-b;
}
}
return best;
}
bool cmp(int a,int b){
return a>b;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
cin>>n;
int num[n];
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
sort(num,num+n,cmp);
int row=findFac();
int col=n/row;
int ans[row][col];
fill(ans[0],ans[0]+n,0);
int i=0,j=0,cnt=0;
int top=0,bot=row,left=0,right=col;
while(cnt<n){
while(cnt<n&&j<right) ans[i][j++]=num[cnt++];
j--,i++,right--;
while(cnt<n&&i<bot) ans[i++][j]=num[cnt++];
j--,i--,bot--;
while(cnt<n&&j>=left) ans[i][j--]=num[cnt++];
j++,i--,left++;
while(cnt<n&&i>top) ans[i--][j]=num[cnt++];
j++,i++,top++;
}
for(int a=0;a<row;a++){
for(int b=0;b<col;b++){
if(b!=0) printf(" ");
printf("%d",ans[a][b]);
}
printf("\n");
}
return 0;
}