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
using namespace std;
typedef long long ll;
const int maxn=10050;
vectorve[105];
vectorans[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=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;
}

 

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