思路:
依次进行右下左上的模拟填充即可
21分:
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//
const int N=1e5+5,M=1e4;//题目没给定范围,可以开大一些
int a[N],res[M][M];
int n;
int main(){
cin>>n;
f(i,0,n){
cin>>a[i];
}
int row,col;//row>col
for(int i=1;i*i<=n;i++){
if(n%i==0)col=i;
}
row=n/col;
sort(a,a+n,greater<int>());
//debug(row)debug(col)
int l=0,r=col,u=0,d=row;
int num=0;
int p;
while(num<n){
p=l;
while(p<r)res[u][p++]=a[num++];
p=u+1;//注意+1,否则出现覆盖现象
while(p<d)res[p++][r-1]=a[num++];
p=r-2;//注意-2
while(p>=l)res[d-1][p--]=a[num++];
p=d-2;
while(p>u)res[p--][l]=a[num++];
l++,r--,u++,d--;
}
f(i,0,row)
f(j,0,col){
if(j!=col-1)cout<<res[i][j]<<" ";
else cout<<res[i][j]<<endl;
}
return 0;
}
25分:
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//
const int N=1e5+5,M=1e4;//题目没给定范围,可以开大一些
int a[N],res[M][M];
int n;
int main(){
cin>>n;
f(i,0,n){
cin>>a[i];
}
int row,col;//row>col
for(int i=1;i*i<=n;i++){
if(n%i==0)col=i;
}
row=n/col;
sort(a,a+n,greater<int>());
//debug(row)debug(col)
int l=0,r=col,u=0,d=row;
int num=0;
int p;
while(num<n){
p=l;
while(p<r && num<n)res[u][p++]=a[num++];
p=u+1;//注意+1,否则出现覆盖现象
while(p<d && num<n)res[p++][r-1]=a[num++];
p=r-2;//注意-2
while(p>=l && num<n)res[d-1][p--]=a[num++];
p=d-2;
while(p>u && num<n)res[p--][l]=a[num++];
l++,r--,u++,d--;
}
f(i,0,row)
f(j,0,col){
if(j!=col-1)cout<<res[i][j]<<" ";
else cout<<res[i][j]<<endl;
}
return 0;
}
分析:
由于矩形不同,最后填充时的角度也不同,因此可能在不同角度结束填充,此时如果不结束,可能导致0元素覆盖之前值的现象,因此没有数的时候,应该提前结束填充