ZOJ-#3465 The Hive(字符串模拟)

本文探讨了一个关于蜂箱布局的模拟问题,通过输入蜂箱的初始状态和操作规则,模拟蜜蜂按照不同列从下向上合并糖果的过程,并计算最终产生的糖果数量及蜂箱布局。详细步骤包括初始化蜂箱状态、读取输入、模拟合并过程和输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      题目大意:给出蜂箱的布局,现在蜜蜂开始按照不同列,从下向上的顺序开始,当上下相邻的两个相同则合并为一个糖果,每一列满了之后,将不会发生任何变化,问有多个糖果产生,以及每一次测试后的蜂箱的布局。

      解题思路:题目描述的不是很清楚,这是一个体力的模拟,直接模拟就可以搞定,但需要很多体力去做,细心一点就可以了。这里就不赘述了,详见code。

      题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3465

     code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 15;
int n,ans;
char p,q;
int a,b,c,d,e,f,g,h,i;
char A[MAXN],B[MAXN],C[MAXN],D[MAXN],E[MAXN],F[MAXN],G[MAXN],H[MAXN],I[MAXN];
char hive[40][30];
char str[40][30]={
    "         _",
    "       _/ \\_",
    "     _/ \\_/ \\_",
    "   _/ \\_/ \\_/ \\_",
    " _/ \\_/ \\_/ \\_/ \\_",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "/ \\_/ \\_/ \\_/ \\_/ \\",
    "\\_/ \\_/ \\_/ \\_/ \\_/",
    "  \\_/ \\_/ \\_/ \\_/",
    "    \\_/ \\_/ \\_/",
    "      \\_/ \\_/",
    "        \\_/"
};

void init(){
    ans=0;
    a=b=c=d=e=f=g=h=i=0;
    memcpy(hive,str,sizeof(str)); //记得初始化,这里WA了好多次
    for(int j=0;j<10;j++)
        memset(A+j,0,sizeof(A+j));
}

void prin(){ //更改对应位置的值
    if(a!=0) for(int j=a;j>0;j--) hive[19-2*j][1]=A[j];
    if(b!=0) for(int j=b;j>0;j--) hive[20-2*j][3]=B[j];
    if(c!=0) for(int j=c;j>0;j--) hive[21-2*j][5]=C[j];
    if(d!=0) for(int j=d;j>0;j--) hive[22-2*j][7]=D[j];
    if(e!=0) for(int j=e;j>0;j--) hive[23-2*j][9]=E[j];
    if(f!=0) for(int j=f;j>0;j--) hive[22-2*j][11]=F[j];
    if(g!=0) for(int j=g;j>0;j--) hive[21-2*j][13]=G[j];
    if(h!=0) for(int j=h;j>0;j--) hive[20-2*j][15]=H[j];
    if(i!=0) for(int j=i;j>0;j--) hive[19-2*j][17]=I[j];
    for(int j=0;j<23;j++){
        printf("%s\n",hive[j]);
    }
}

int main(){
    //freopen("input.txt","r",stdin);
    while(~scanf("%d",&n)){
        getchar();
        init();
        for(int j=0;j<n;j++){
            scanf("%c%c",&p,&q);
            getchar();
            if(p=='A' && a<7){ //对应列的计数
                A[++a]=q;
                if(A[a]==A[a-1] && a!=1){ans++;a-=2;continue;}
            }
            else if(p=='B' && b<8){
                B[++b]=q;
                if(B[b]==B[b-1] && b!=1){ans++;b-=2;continue;}
            }
            else if(p=='C' && c<9){
                C[++c]=q;
                if(C[c]==C[c-1] && c!=1){ans++;c-=2;continue;}
            }
            else if(p=='D' && d<10){
                D[++d]=q;
                if(D[d]==D[d-1] && d!=1){ans++;d-=2;continue;}
            }
            else if(p=='E' && e<11){
                E[++e]=q;
                if(E[e]==E[e-1] && e!=1){ans++;e-=2;continue;}
            }
            else if(p=='F' && f<10){
                F[++f]=q;
                if(F[f]==F[f-1] && f!=1){ans++;f-=2;continue;}
            }
            else if(p=='G' && g<9){
                G[++g]=q;
                if(G[g]==G[g-1] && g!=1){ans++;g-=2;continue;}
            }
            else if(p=='H' && h<8){
                H[++h]=q;
                if(H[h]==H[h-1] && h!=1){ans++;h-=2;continue;}
            }
            else if(p=='I' && i<7){
                I[++i]=q;
                if(I[i]==I[i-1] && b!=1){ans++;i-=2;continue;}
            }
        }
        printf("The number of candy is %d.\n",ans);
        prin();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值