刚开始没加判断数组是否已经排完的语句,发现有一个点过不去
原因是当从左到右只有一列时,再执行完从上到下,接着从右到左不进入循环,但是从下到上仍可能进入循环,
所以可以设置一个判断语句,当只有一列时,执行完从上到下就跳出(只有一列必然是从上到下,可以证明n为偶数刚好完成整个外围循环,此时从下到上结束,当n为奇数只能从左到右,再从上到下)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int p,i,j,n,m,num;
vector<int> b;
cin>>num;
for(int q=0;q<num;q++){
int temp;
scanf("%d",&temp);
b.push_back(temp);
}
sort(b.begin(),b.end());
for(int q=1;q*q<=num;q++){
if(num%q==0){
m=num/q;
n=q;
}
}
if(n==1){
for(int q=num-1;q>=0;q--){
if(q!=num-1) printf("\n");
printf("%d",b[q]);
}
}else{
int a[m][n];
int k=num-1;
for(p=0;p<=(n-1)/2;p++){
i=p;
for(j=p;j<=n-1-p;j++){
if(k>=0)
a[i][j]=b[k--];
}
j--;
for(i=p+1;i<=m-1-p;i++){
if(k>=0)
a[i][j]=b[k--];
}
i--;
for(j=n-1-p-1;j>=p;j--){
if(k>=0)
a[i][j]=b[k--];
}
j=p;
for(i=m-1-p-1;i>=p+1;i--){
if(k>=0)
a[i][j]=b[k--];
}
}
for(int x=0;x<m;x++){
for(int y=0;y<n;y++){
if(y!=0) printf(" ");
printf("%d",a[x][y]);
}
printf("\n");
}
}
return 0;
}