石头青蛙会吐出颜色各异的珠子,与沿着一条轨迹运行的一串珠子相接,一旦三颗或以上的珠子连在一起,则这几颗珠子即可消失,而且可以产生连锁反应。我们所要做的就是尽量消除珠子,以防止珠子滚入轨迹尽头的洞中。珠子落入洞中即为输掉,所有珠子都消失则为获胜。
现在我们用字符表示珠子,其中r代表红色珠子,b代表蓝色珠子,g代表绿色珠子,y代表黄色珠子;用一个字符串代表轨迹中当前各个珠子;用整数代表青蛙吐出的珠子发射到轨迹中的位置,如1代表放到最前边,2代表放到第一个珠子后边等等。则珠子消失的规则如下:
1、当青蛙吐出的珠子到位后,如果与之相邻的珠子颜色与之相同且连续超过3个(包括青蛙吐出的这颗珠子),则所有这些颜色相同且连续的珠子都消失。例如青蛙吐出的珠子为红色,吐到轨迹上的位置为3,轨迹上的珠子为bbrr,则吐出的珠子到位后轨迹上的珠子状态应为bbrrr,三颗红色珠子符合消失条件,要消失,最终轨迹上剩下两颗蓝色的珠子,即bb。在这个例子中吐到轨迹上的位置为3、4或5结果都是一样的,如果为2,则最终的输出结果应为brbrr。
2、连锁反应规则为当第一次消失发生后,剩下的两段珠子自然相接,如果相接的两个珠子颜色相同且连续超过三个(包括相接的两个珠子),则这些连续且颜色相同的珠子消失。例如青蛙吐出的珠子为红色,吐到轨迹上的位置为5,轨迹上的珠子为bbggrrrgbbyyy则最终轨迹上应为3颗黄色的珠子。过程为新的红色的珠子加入后导致中间的红色珠子满足消失条件,消失了;红色珠子消失后中间的绿色珠子自然相接,满足连锁反应条件,这些绿色珠子也消失了,同理蓝色的珠子也消失的,最后只剩下3颗黄色的珠子,即yyy。特别要注意的是这里的三颗黄色的珠子虽然数量上够了,但由于未与其他同颜色的珠子相接,所以不满足消失的条件。同样,轨迹上其他地方如果还有连续超过3个眼色相同的珠子(原有的)也不能消失。
现在就请你写一段程序来实现这些游戏规则。
输入格式:
只有一行,分三段,开始是一个字符接着是一个整数,最后是一个字符串。字符代表青蛙吐出的珠子的颜色;整数代表青蛙图出的珠子发射到轨迹中的位置,如1代表放到最前边,2代表放到第一个珠子后边等等;字符串代表轨迹中当前的珠子及相应位置。测试数据保证字符串长度小于100,且其他输入合法。
输出格式:
也只有一行,为青蛙吐出珠子后轨道上珠子的状态,如果轨道上所有的珠子都消失了则输出win。
输入样例:
r 5 bbggrrrgbbyyy
输出样例:
yyy
#include<stdio.h>
#include<string.h>
int main(){ //r 5 bbggrrrgbbyyy
char ch;
int x;
char s[100];
scanf("%c",&ch);
scanf("%d",&x);
scanf("%s",s);
int t=strlen(s);
for(int i=t;i<100;i++){
s[i]='\0';
}
for(int i=t;i>=x;i--){
s[i]=s[i-1];//将在x位置及之后的珠子均向后挪一位
}
s[x-1]=ch;//插入发射出的珠子
int l=x-1;
int r;
do{
while(s[l-1]==s[l]){
l--;
}
r=l;
while(s[r]==s[r+1]){
r++;
}
r--;
//l与r分别为一串相同颜色珠子的起始位置与终止位置的前一位
//如:s="rrr",则l=0, r=1
if(r-l+1>=2){
for(int i=l;i<=t;i++){
s[i]=s[i+r-l+2];
}
}
}while(s[l-1]==s[l]);
if(strlen(s)!=0){
printf("%s",s);
}
else printf("win");
}