题解:P10257 [COCI 2023/2024 #5] Zlagalica
远古时期做的题了没想到竟然能写题解。
思路
模拟。其实题面已经把思路给出来了,强行覆盖即可。
这里只讲几个需要注意的点。
- 因为没有限制高度,所以把初始点放在最中间(旁边也可以),输出的时候像四周找就可以了。
- 拼的时候四个角的坐标别算错了。
- 因为 \(1\),所以数组要开大一点。
点击查看代码
#include<iostream>
using namespace std;
char ans[5005][5005];
int n , x[25] , ll = 0x3f3f3f3f , lr , hr , leftx , lefty;
struct node{
char c;int r , s , u , d;
}cnt[25] , a[25];
int main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i=1;i<=n;i++)cin >> cnt[i].c >> cnt[i].r >> cnt[i].s >> cnt[i].u >> cnt[i].d;
for(int i=1;i<=n;i++)cin >> x[i];
for(int i=1;i<=n;i++)a[i] = cnt[x[i]];
for(int i=1;i<=a[1].r;i++){
for(int j=1;j<=a[1].s;j++)ans[i+1000][j] = a[1].c , ll = min(ll,i+1000) , lr = max(lr,i+1000) , hr = max(hr,j);
}
leftx = a[1].r + 1000 , lefty = 1;
for(int i=2;i<=n;i++){
if(a[i-1].u==0){
int x = leftx - a[i-1].r , y = lefty + a[i-1].d - 1;
for(int xx=x-a[i].r+1;xx<=x;xx++){
for(int yy=y;yy<=y+a[i].s-1;yy++){
ans[xx][yy] = a[i].c , ll = min(ll,xx) , lr = max(lr,xx) , hr = max(hr,yy);
}
}
leftx = x , lefty = y;
}else{
int x = leftx - a[i-1].r + a[i-1].d , y = lefty + a[i-1].s;
for(int xx=x-a[i].r+1;xx<=x;xx++){
for(int yy=y;yy<=y+a[i].s-1;yy++){
ans[xx][yy] = a[i].c , ll = min(ll,xx) , lr = max(lr,xx) , hr = max(hr,yy);
}
}
leftx = x , lefty = y;
}
}
cout << lr - ll + 1 << " " << hr << "\n";
for(int i=ll;i<=lr;i++){
for(int j=1;j<=hr;j++){
if(ans[i][j]>='a'&&ans[i][j]<='z')cout << ans[i][j];
else cout << ".";
}
cout << "\n";
}
return 0;
}

浙公网安备 33010602011771号