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

题目链接https://www.jisuanke.com/contest/7332


纯粹的画画题(可光题意就理解了一年)
此生再也不愿意做这种题(流泪)


#include
using namespace std;
typedef long double db;
const int N=1e3+7;
int t,cs;
int n;
vector<string>vc[N];
string s,ss;
int len[N];
vector<int>id[N];
int tot[N],num;
struct Node{
    string s[8];
}a[N];
void solve(int x){


    for(int i=0;i<8;i++) a[x].s[i]="";
    for(int i=1;i<=len[x]+2;i++) a[x].s[0]+="#";
    int up=(6-vc[x].size())/2;

    for(int i=1;i<=up;i++){
        a[x].s[i]+="#";
        for(int j=1;j<=len[x];j++) a[x].s[i]+=" ";
        a[x].s[i]+="#";
    }

    for(int i=up+1,j=0;j<vc[x].size();i++,j++){
        a[x].s[i]+="#";
        int le=(len[x]-vc[x][j].length())/2;
        for(int j=1;j<=le;j++) a[x].s[i]+=" ";
        a[x].s[i]+=vc[x][j];
        while(a[x].s[i].length()<len[x]+1) a[x].s[i]+=" ";
        a[x].s[i]+="#";
    }
    for(int i=up+1+vc[x].size();i<7;i++){
        a[x].s[i]+="#";
        for(int j=1;j<=len[x];j++) a[x].s[i]+=" ";
        a[x].s[i]+="#";
    }
    for(int i=1;i<=len[x]+2;i++) a[x].s[7]+="#";

}
int stlen[N];
char ans[N][N];
int ps[N][N];
stack<int>st[N];
int top;
void draw(int x,int y,int c){
    for(int i=x,ii=0;i<8+x;i++,ii++){
        for(int j=y,k=0;k<len[c]+2;j++,k++){
            ans[i][j]=a[c].s[7-ii][k];
            top=max(top,i);
        }
    }
}
char c[N];
int main()
{
    scanf("%d",&t);
    while(t--){
        memset(ps,0,sizeof(ps));
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                ans[i][j]=' ';
            }
        }
        memset(stlen,0,sizeof(stlen));
        memset(tot,0,sizeof(tot));
        memset(len,0,sizeof(len));
        for(int i=0;i<N;i++){
             while(!st[i].empty()) st[i].pop();
             id[i].clear();
             vc[i].clear();
        }
        scanf("%d",&n);
        getchar();
        top=0;
        for(int i=1;i<=n;i++){
            vc[i].clear();
            ss="";
            len[i]=0;

            gets(c);
            ss="";
            int llll=strlen(c);
            for(int j=0;j<llll;j++){
                if(c[j]=='#') len[i]=max(len[i],(int)ss.length()),vc[i].push_back(ss),ss="";
                else ss+=(c[j]);
            }

            vc[i].push_back(ss);
            len[i]=max(len[i],(int)ss.length());
            solve(i);

        }



        printf("Can Stack #%d:\n",++cs);
        for(int i=1;i<=6;i++) printf("         %d",i);
        printf("\n");
        for(int i=1;i<=6;i++) printf("1234567890");
        printf("\n");


        memset(stlen,0,sizeof(stlen));
        int mx=0;
        int ri=-2;
        num=0;
        for(int i=1;i<=n;i++){
            bool flag=false;

            for(int j=1;j<=num;j++){
                if(stlen[j]>len[i]){
                    int le=(stlen[j]-len[i])/2;
                    ps[j][st[j].size()+1]=ps[j][st[j].size()]+le;
                    st[j].push(i);
                    draw((st[j].size()-1)*8,ps[j][st[j].size()],i);
                    flag=true;
                    stlen[j]=len[i];
                    break;
                }
            }
            if(flag==false){
                num++;
                draw(0,ri+2,i);
                while(!st[num].empty()) st[num].pop();
                stlen[num]=len[i];
                st[num].push(i);
                ps[num][1]=ri+2;
                ri+=3+len[i];
            }
        }
        for(int i=top;i>=0;i--){
            int ri=100;
            for(int j=100;j>0;j--){
                if(ans[i][j]==' ') ri=j;
                else break;
            }
            for(int j=0;j<ri;j++){
                printf("%c",ans[i][j]);
            }
            printf("\n");
        }
        printf("\n");

    }
}
/**
10
5
1000000000#111#1111111111
1#1#1#1
2#23#53
9999999999999999
100#100
5
10000000
100#100
1000#10
10000#1
1
*/

你可能感兴趣的:(模拟题)