您的位置:首页 > 其它

清华OJ 祖玛游戏 模拟 解题报告

2017-07-07 15:28 344 查看

【问题描述】

祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。



开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能,而回放功能的实现则委托你来完成。

游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。

【输入格式】

第一行是一个由大写字母’A’~’Z’组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。

第二行是一个数字 ,表示整个回放过程共有 次操作。

接下来的 行依次对应于各次操作。每次操作由一个数字 和一个大写字母 描述,以空格分隔。其中, 为新珠子的颜色。若插入前共有 颗珠子,则 表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序。

【输出格式】

输出共 行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上

NOIP 模拟题 hao

第 3 页 共 6 页

的珠子序列。

如果轨道上已没有珠子,则以“-”表示。

【样例输入】

ACCBA

5

1 B

0 A

2 B

4 C

0 A

【样例输出】

ABCCBA

AABCCBA

AABBCCBA

-

A

【样例解释】

╭︿ ︿ ︿╮

{/ o o /}

( ( o o ) )

︶ ︶ ︶

思路

模拟,注意坑点:

1、有空串。

2、合并时特判。

插入小技巧与具体注意事项见代码备注。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=2000+5;
int n,x;
char y,a
,tmp
;
int check(int t)
{
int step=0,pos=t;
while (pos<=strlen(a)&&a[pos++]==a[t]) step++;//有没有可以消除的
pos=t-1;
while (pos>=0&&a[pos--]==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("hao.in","r",stdin);
//  freopen("hao.out","w",stdout);
gets(a);//防止空串
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %c",&x,&y);
strcpy(tmp,a+x);
a[x]=y;
strcpy(a+x+1,tmp);//精妙的插入
while (check(x)==1) x=change(x);
if (a[0]=='\0') printf("-\n");//没有了
else printf("%s\n",a);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: