机房练习赛hao 【Tsinghua OJ】祖玛(Zuma) (字符串)

来源:互联网 发布:怎么联系淘宝达人合作 编辑:程序博客网 时间:2024/06/05 06:48

机房练习赛hao

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

思路:
一道模拟题,大佬们都用双向链表或vector模拟。
然而我第一次链表写挂了,后来发现直接字符串模拟就好。
strcpy的应用。
但是要注意几点,一个就是开始可能是有连续三个及以上的(可能是题目不太严谨),没有打到他们的时候是不会消掉的。还有就是最开始可能是一个空串,消的时候不只是消三个(有多少连续的就要消掉多少)。
字符串的题目要注意读入,建议gets。

#include <cstdio>  #include <cstring>#include <iostream>using namespace std;char ch[20010], temp[20010];  int size, pos;int ckeck(int a){      int ll = a, rr = a;    char cc; cc = ch[a];    while(ch[ll] == cc && ll) ll--;    if(ll || ch[ll] != cc) ll++;    while(ch[rr] == cc && rr < size) rr++;    if(rr - ll > 2){        strcpy(temp, ch + rr);        strcpy(ch + ll, temp);//消除ll~rr         size = size + ll - rr;        pos = ll;        return 1;    }    else return 0;}int main(){      freopen("hao.in", "r", stdin);    freopen("hao.out", "w", stdout);    char cc; gets(ch);    while(ch[size] >= 'A' && ch[size] <= 'Z') size++;    int T; scanf("%d", &T);    while( T-- ){        scanf("%d %c", &pos, &cc);        strcpy(temp, ch + pos);        strcpy(ch + pos + 1, temp);//腾出pos          ch[pos] = cc; size++;          while(ckeck(pos) && size);          if(size) puts(ch);          else puts("-");      }      return 0;  }