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