#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. 错误分析:一开始想用模拟,结果模拟错误。