原题链接:
思路:先排序,再模拟打印就OK了,注意细节,详见代码。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n,r,c;
int num[maxn];
int mat[maxn][maxn];
void print(){
for(int i=0;i<r;i++){
printf("%d",mat[i][0]);
for(int j=1;j<c;j++){
printf(" %d",mat[i][j]);
}
printf("\n");
}
}
void solve(){
int t=n;
int i=0,j=0;
mat[i][j]=num[--t];
while(t>0){
//从左到右
while(j+1<c&&!mat[i][j+1]){
mat[i][++j]=num[--t];
}
//从上往下
while(i+1<r&&!mat[i+1][j]){
mat[++i][j]=num[--t];
}
//从右往左
while(j>0&&!mat[i][j-1]){
mat[i][--j]=num[--t];
}
//从下往上
while(i>0&&!mat[i-1][j]){
mat[--i][j]=num[--t];
}
}
print();
}
void input(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
sort(num,num+n);
r=sqrt(n);
while(n%r){
r++;
}
//开方可能得到较小值
r=max(r,n/r);
c=n/r;
}
int main(){
//freopen("in.txt","r",stdin);
input();
solve();
return 0;
}