题目描述
祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。
给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。
输入
第一行是一个由大写字母'A'~'Z'组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。
第二行是一个数字n,表示玩家共有n次操作。
接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母描述,以空格分隔。其中,大写字母为新珠子的颜色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。
输出
输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。
如果轨道上已没有珠子,则以“-”表示。
输入输出样例
输入样例1 <-复制
ACCBA
5
1 B
0 A
2 B
4 C
0 A
输出样例1
ABCCBA
AABCCBA
AABBCCBA
-
A
AC代码
#include<iostream>
#include<stdlib.h>
using namespace std;
struct zuma
{
char fu;
zuma *prior, *next;
};
int create(zuma *head)
{
char fu;
int i;
zuma *p = head;
cin >> fu;
if (fu == '-')
{
cin >> fu;
return fu - '0';
}
while (fu >= 'A'&& fu<= 'Z')
{
zuma *s = new zuma;
s->fu = fu;
p->next = s;
s -> next = head;
s->prior = p;
p = s;
head->prior = s;
head->fu++;
cin >> fu;
}
return fu-'0';
}
void insert(zuma *head,int k, char fu)
{
int i;
zuma *p = head;
for (i = 0; i < k; i++)
{
p = p->next;
}
zuma *s = new zuma;
s->fu = fu;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
head->fu++;
}
void pan(zuma* head)
{
int i;
int shu = 0;
zuma *p = head->next;
char flag = p->fu;
int bian = 0;
while (p != head)
{
if (p->fu == flag)
shu++;
else
{
flag = p->fu;
shu = 1;
}
if (shu == 3)
{
zuma *q = p->prior->prior;
zuma *w = p->prior;
zuma *e = p;
p = p->next;
while (p->fu == q->fu)
p = p->next;
q->prior->next = p;
p->prior = q->prior;
free(q);
free(w);
free(e);
bian = 1;
}
if (bian == 1)
{
p = head->next;
shu = 0;
flag = p->fu;
bian = 0;
}
else
p = p->next;
}
}
void show(zuma *head)
{
if (head->next==head)
{
cout << "-" << endl;
return;
}
zuma *p = head->next;
while (p != head)
{
cout << p->fu;
p = p->next;
}
cout << endl;
}
int main()
{
zuma *chuan = new zuma;
chuan->next = chuan;
chuan->prior = chuan;
int t=create(chuan);
int k;
char fu;
while (t--)
{
cin >> k >> fu;
insert(chuan,k, fu);
pan(chuan);
show(chuan);
}
}
(by 归忆)