题解:P10257 [COCI 2023/2024 #5] Zlagalica
Void_Trailwalker · · 题解
blog
远古时期做的题了没想到竟然能写题解。
思路
模拟。其实题面已经把思路给出来了,强行覆盖即可。 这里只讲几个需要注意的点。
- 因为没有限制高度,所以把初始点放在最中间,旁边也可以,输出的时候像四周找就可以了。
- 拼的时候四个角的坐标别算错了。
- 因为
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; }