题目描述
祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。
给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。
输入
第一行是一个由大写字母'A'~'Z'组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。
第二行是一个数字n,表示玩家共有n次操作。
接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母描述,以空格分隔。其中,大写字母为新珠子的颜色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。
输出
输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。
如果轨道上已没有珠子,则以“-”表示。
样例输入
ACCBA 5 1 B 0 A 2 B 4 C 0 A
样例输出
ABCCBA AABCCBA AABBCCBA - A
提示
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
#define ok 0
#define error -1
class CNode
{
public:
char data;
CNode *next;
CNode *before;
CNode()
{
next=NULL;
before=NULL;
}
CNode(char n,CNode *p,CNode *q)
{
data=n;
next=p;
before=q;
}
};
class CList
{
friend class CNode;
CNode *head;
int nodenumber;
public:
CList()
{
head=NULL;
nodenumber=0;
}
void createdoubleTailList(char *num,int n)
{
CNode *tail;
CNode *s;
head=new CNode();
tail=head;
int i;
for(i=0;i<n;i++)
{
s=new CNode(num[i],NULL,tail);
tail->next=s;
tail=s;
nodenumber++;
}
}
CNode *indexfind(int i)
{
if(i<0)
{
return NULL;
}
CNode *p=head;
int k=1;
while(k<=i&&p!=NULL)
{
p=p->next;
k++;
}
return p;
}
void Insert(int i,char c)
{
nodenumber++;
if(nodenumber==1)
{
CNode *temp=new CNode(c,NULL,head);
head->next=temp;
return;
}
CNode *p=indexfind(i);
CNode *beforeI=indexfind(i-1);
CNode *temp=new CNode(c,p,beforeI);
beforeI->next=temp;
temp->next->before=temp;
}
void Delete(int i)
{
nodenumber--;
CNode *beforeI=indexfind(i-1);
CNode *p=indexfind(i);
CNode *temp=p;
beforeI->next=p->next;
if(p->next!=NULL)
p->next->before=beforeI;
delete temp;
}
int BEGIN()
{
CNode *p=head->next;
int index=1;
while(p!=NULL)
{
int count=1;
CNode *cur=p->next;
while(cur!=NULL&&p->data==cur->data)
{
count++;
cur=cur->next;
}
if(count>=3)
{
for(int i=index,j=0;j<count;j++)
{
Delete(i);
}
return ok;
}
index++;
p=p->next;
}
return error;
}
void display()
{
CNode *p=head->next;
if(p==NULL)
{
cout<<"-"<<endl;
return;
}
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
cout<<endl;
}
};
int main()
{
char str[1000];
cin>>str;
int n;
cin>>n;
int len=strlen(str);
CList L;
L.createdoubleTailList(str,len);
while(n--)
{
int index;
char ch;
cin>>index>>ch;
L.Insert(index+1,ch);
while(1)
{
if(L.BEGIN()!=ok)
break;
}
L.display();
}
return 0;
}
来源:https://www.cnblogs.com/SZU-DS-wys/p/12177959.html