#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n1;
scanf("%d",&n1);
int m,n;
for(int i=sqrt(n1);i>=0;i--){
if(n1%i==0){
m=max(i,n1/i);
n=min(i,n1/i);
break;
}
}
// cout<<m<<n;
int a1[100000];
for(int i=0;i<n1;i++)
scanf("%d",&a1[i]);
sort(a1,a1+n1,cmp);
// for(int i=0;i<n1;i++)
// printf("%d",a1[i]);
vector<vector<int> > a(m,vector<int>(n));
int count=1;
int k=0;
int t=0,i,j;
int c=m/2+m%2;
for(int l=0;l<c;l++){
for(int j=l;j<=n-1-l&&k<=n1-1;j++) a[l][j]=a1[k++];
for(int j=l+1;j<=m-2-l&&k<=n1-1;j++) a[j][n-1-l]=a1[k++];
for(int j=n-1-l;j>=l&&k<=n1-1;j--) a[m-1-l][j]=a1[k++];
for(int j=m-2-l;j>=l+1&&k<=n1-1;j--) a[j][l]=a1[k++];
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf("%d",a[i][j]);
if(j!=n-1) printf(" ");
}
if(i!=m-1) printf("\n");
}
}
知识点:
1. 动态内存:vector二维向量:定义:vector<vector<int> > b(m,vector<int>(n)):定义一个m*n大小的vector容器。另外也可以动态变量(现在还不会,没看懂),也可以在全局变量定义一个很大的数组。
2. 关于找m,n:从sqrt(N)向前找。
3. 关于填充方法:[矩形法](https://www.liuchuo.net/archives/2070),寻找四个角的规律。[碰壁法](http://www.cnblogs.com/zhien-aa/p/5671115.html),遇到已经填充的格子改变方向。
4. 大神博客:https://me.csdn.net/oliver__lew。
5. 错误分析:一开始想用模拟,结果模拟错误。