UCF Local Programming Contest 2012(Practice)E. Pete's Pantry 【模拟】

题意:

n个罐子,每个罐子印了几行字,一行以#为界,最长的的一行记为w,每个罐子是高为6,宽为w的矩形+外面一圈#。按输入顺序将罐子叠放起来,规则为:罐子A(宽度w)只能放在宽度比它大的其他罐子上。从左往右遍历栈,如果当前最高栈罐子的宽度大于w,该罐子叠放到这一栈上。如果找不到这种栈,在最右边开辟一个新栈。另外,每个罐子叠放的位置和字的位置尽可能居中对齐,若不能,可以偏左或偏上一格。

最后让你输出罐子叠放的图。图最大为80*60


题解:

没什么好说的,模拟就完事了 。

mp[][]最后存放的图;w[]每个罐子的宽度;ve[]每个罐子上的字;ans[i]第i栈上存放的罐子id;st[i]第i栈目前最高的罐子的宽度;

h,d是每个罐子的上下界,l,r是每个罐子的左右阶,left是当前列的左边界。

kai是居中处理过后开始的行位置,o是居中处理过后的没一行字开始的列位置。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10050;
vector<string>ve[105];
vector<int>ans[105];
int w[105],st[maxn];
char s[maxn];
char mp[1005][105];
int main()
{
    int n,t,ka=0;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        getchar();
        for(int i=1;i<=n;i++){
            ve[i].clear();
            gets(s+1);
            int len=strlen(s+1);
            string ss="";
            w[i]=0;
            for(int j=1;j<=len;j++){
                if(s[j]=='#'){
                    ve[i].push_back(ss);
                    int tmp=ss.length();
                    w[i]=max(w[i],tmp);
                    ss="";
                }
                else ss+=s[j];
            }
            ve[i].push_back(ss);
            int tmp=ss.length();
            w[i]=max(w[i],tmp);
            //printf("w[%d]:%d\n",i,w[i]);
        }
        printf("Can Stack #%d:\n",++ka);
        for(int i=1;i<=6;i++){
            for(int j=1;j<10;j++){
                printf(" ");
            }
            printf("%d",i);
        }
        printf("\n");
        for(int i=1;i<=6;i++){
            for(int j=1;j<=10;j++){
                printf("%d",j%10);
            }
        }
        printf("\n");
        int now=0,mx=0;
        for(int i=1;i<=n;i++){
            int flag=0;
            for(int j=1;j<=now;j++){
                if(st[j]>w[i]){
                    flag=1;
                    ans[j].push_back(i);
                    st[j]=w[i];
                    break;
                }
            }
            if(!flag){
                now++;
                ans[now].clear();
                ans[now].push_back(i);
                st[now]=w[i];
            }
        }
        for(int i=1;i<=now;i++){
            mx=max(mx,(int)ans[i].size());
        }
        mx=mx*8;
        for(int i=1;i<=mx;i++)
            for(int j=1;j<=60;j++) mp[i][j]=' ';
        int left=1;
        for(int k=1;k<=now;k++){
            int l=left,r=left+w[ans[k][0]]+1;
            int h=0,d=-7;
            //for(int i=l;i<=r;i++) mp[h][i]=mp[d][i]='#';
            //for(int i=h;i>=d;i--) mp[i][l]=mp[i][r]='#';
            int y=ans[k].size();
            int rr=r;
            //if(y>1){
                for(int i=0;i<y;i++){
                    int f=((r-l+1)%2)^((w[ans[k][i]])%2);
                    int xiao=(r-l+1-w[ans[k][i]]-2)/2;
                    //printf("!%d\n",xiao);
                    if(f){
                        l+=xiao;
                        r-=xiao;
                        r--;
                    }
                    else{
                        l+=xiao;
                        r-=xiao;
                    }
                    h+=8;d+=8;
                    int id=ans[k][i];
                    int hi=ve[id].size(),kai;
                    if(hi%2){
                        kai=h-(7-hi)/2;
                    }
                    else{
                        kai=h-(8-hi)/2;
                    }
                    for(int j=0;j<hi;j++){
                        int o=l+1;
                        int tp=ve[id][j].size();
                        int ff=((r-l+1)%2)^(tp%2);
                        if(ff){
                            o+=(r-l-2-tp)/2;
                        }
                        else o+=(r-l-1-tp)/2;
                        for(int p=0;p<ve[id][j].size();p++){

                            mp[kai][p+o]=ve[id][j][p];
                        }
                        kai--;
                    }
                    //printf("!%d\n",l,r,h,d);
                    for(int j=l;j<=r;j++) mp[h][j]=mp[d][j]='#';
                    for(int j=h;j>=d;j--) mp[j][l]=mp[j][r]='#';
                }
            //}
            left=rr+2;
        }

        for(int i=mx;i>=1;i--){
            for(int j=1;j<=60;j++){
                printf("%c",mp[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值