mooc 数据结构作业(二)祖玛(Zuma)

描述

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

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

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

输入

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

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

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

输出

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

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

样例

见英文题面

限制

0 ≤ n ≤ 10^4

0 ≤ 初始珠子数量 ≤ 10^4

时间:2 sec

内存:256 MB

提示

列表

题意:输入一个字符串,在某个位置插入某个字母,如果有连续3个以上相同的就消除。输出最后的字符串

思路:完全字符串操作,将字母插入编程完整字符串,然后匹配3个以上的字符删除,知道没有可消除的位置。

注意:输入字符串可能为空,所以第一行用gets 而不是scanf

拼接字符串用

strcpy(tmp,str+i);
strcpy(str+startpos,tmp);

而非 strcpy(str+startpos,str+i);

原因是为什么?我还有些疑问orz

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 char str[20005];
 6 int n;
 7 char tmp[20005];
 8 void cal(int t,char ch){
 9     char *p;
10     p=str;
11     strcpy(tmp,p+t);
12     str[t]=ch;
13     strcpy(str+t+1,tmp);
14 }
15 
16 bool hasRepeat(){
17     int len=strlen(str);
18     int i=0;
19     while(i<len){
20         char t=str[i];
21         int startpos=i;
22         int times=0;
23         while(i<len&&t==str[i]){
24             times++;
25             i++;
26         }
27         if(times>=3){
28     strcpy(tmp,str+i);
29     strcpy(str+startpos,tmp);
30     return true;
31         }
32     }
33     return false;
34 }
35 int main(){
36     int t;
37     char ch;
38     gets(str);
39     scanf("%d",&n);
40     for(int i=0;i<n;i++){
41         scanf("%d %c",&t,&ch);
42         cal(t,ch);
43         while(hasRepeat());
44         if(strlen(str)==0)
45             printf("-
");
46         else printf("%s
",str);
47     }
48 }
View Code
原文地址:https://www.cnblogs.com/Yvettey-me/p/9507767.html