1.顺时针填矩阵
2.math
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
int x,y;
};
node op[4];
bool isprime(int x){ //这里1虽然不是素数但也此题也可放入该列 if(x==1) return true;
int k = (int)sqrt(x); for(int i=2;i<=k;i++) if(x%i==0) return false;
return true;
}
bool cmp(int a,int b){ return a>b;}
int main()
{ //初始化方向左、下、右、上 op[0]={0,1};
op[1]={1,0};
op[2]={0,-1};
op[3]={-1,0};
int n=1,m=2,val;
scanf("%d",&val);
int a[val];
for(int i=0;i<val;i++)
scanf("%d",&a[i]);
int minn = 999999999,tm,tn;
sort(a,a+val,cmp);
if(isprime(val)){
for(int i=0;i<val;i++)
printf("%d\n",a[i]);
}
else{
for(int i=2;i<val;i++){
if(val%i==0){
tm = max(val/i,i);
tn = val/tm;
if(tm-tn < minn){
m = tm;
n = tn;
minn = m - n;
}
}
} int vis[m][n],ans[m][n];
memset(vis,0,sizeof(vis));
int s1=0,s2=0;
ans[0][0] = a[0];
vis[0][0] = 1;
int pre = 0; //索引之前的方向 for(int i=1;i<val;i++){
int x,y; x = s1+op[pre].x;
y = s2+op[pre].y; int cnt =0;
//要是之前的方向行不通,就寻找合适的方向 while(0>x || x>=m || 0>y || y>= n || vis[x][y] == 1){
pre++;
cnt++;
if(cnt>5) break; //最后一个数的跳出
if(pre>3) pre=0;
x = s1+op[pre].x;
y = s2+op[pre].y;
}
vis[x][y] = 1;
s1 = x;
s2 = y;
ans[x][y] = a[i];
} for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j!=0) printf(" ");
printf("%d",ans[i][j]);
}
printf("\n");
}
}
return 0;
}