祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。
给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。
第一行是一个由大写字母‘A‘~‘Z‘组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。
第二行是一个数字n,表示玩家共有n次操作。
接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母描述,以空格分隔。其中,大写字母为新珠子的颜色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。
输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。
如果轨道上已没有珠子,则以“-”表示。
#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