快乐模拟,不难想,想ac确实需要想。
有两个点不好想,是因为是素数的点,比如3项,如果不注意,在一层里一个点可能会被赋值多次,导致越界,RA
#include<bits/stdc++.h>
using namespace std;
int num[10001];
int ans[10001][10001];
bool cmp(int a,int b){
return a>b;
}
int cnt=0;
void spiral(int level,int a,int b){
if(level>=b) return;
for(int i=level;i<a-level;i++){
ans[level][i]=num[cnt++];
if(cnt>=a*b) return;
}
for(int i=level+1;i<b-level;i++){
ans[i][a-level-1]=num[cnt++];if(cnt>=a*b) return;
}
for(int i=a-level-2;i>=level;i--){
ans[b-level-1][i]=num[cnt++];if(cnt>=a*b) return;
}
for(int i=b-level-2;i>=level+1;i--){
ans[i][level]=num[cnt++];if(cnt>=a*b) return;
}
spiral(level+1,a,b);
}
int main(){
int n;
scanf("%d",&n);
if(n==0) return 0;
for(int i=0;i<n;i++){
scanf("%d",num+i);
}
sort(num,num+n,cmp);
int a=(int)sqrt((double)n);
while(n%a!=0){
a--;
}
int b=n/a;
//printf("%d %d",a,b);
spiral(0,a,b);
for(int i=0;i<b;i++){
for(int j=0;j<a;j++){
printf("%d",ans[i][j]);
if(j!=a-1)printf(" ");
}
printf("\n");
}
return 0;
}