祖玛游戏

祖玛游戏

问题描述:
祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。
开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能,而回放功能的实现则委托你来完成。
游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。
输入格式:
第一行是一个由大写字母’A’~’Z’组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。
第二行是一个数字,表示整个回放过程共有次操作。
接下来的行依次对应于各次操作。每次操作由一个数字和一个大写字母描述,以空格分隔。其中,为新珠子的颜色。若插入前共有颗珠子,则表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序。
输出格式:
输出共行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。
如果轨道上已没有珠子,则以“-”表示。
样例输入:
ACCBA
5
1 B
0 A
2 B
4 C
0 A
样例输出
ABCCBA
AABCCBA
AABBCCBA
-
A
规则:
这个游戏与平时的祖玛游戏不太一样。
在AAABBCCC中的A和B之间插入B时,BBB消去,CCC也消去,但是AAA不会改变。
输入也会出现空串的情况,使用gets读

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=2010;
int n,x;
char y,a[maxn],tmp[maxn];
bool judge(int t)
{
    int step=0,tmpo=t;
    while(tmpo<=strlen(a)&&a[tmpo++]==a[t])
    step++;tmpo=t-1;
    while(tmpo>=0&&a[tmpo--]==a[t])
    step++;
    if(step>=3)
    return 1;
    return 0;
}
int change(int t)
{
    int end=t,star=t;
    while(a[star]==a[t])
    star--;star++;
    while(a[end]==a[t])
    end++;
    strcpy(a+star,a+end);
    if(a[star]==a[star-1])
    {
        if(star==0)
        return 1;
        return star;
    }
    else if(a[star]==a[star+1])
    return star;
    return 0;
}
int main()
{
    freopen("ha.in","r",stdin);
    freopen("ha.out","w",stdout);
    gets(a);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y;
        strcpy(tmp,a+x);
        a[x]=y;
        strcpy(a+x+1,tmp);
        while(judge(x))
        x=change(x);
        if(a[0]=='')
        cout<<"-"<<endl;
        else cout<<a<<endl;
    }
    fclose(stdin);fclose(stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/cax1165/p/6070907.html