首页 > 其他 > 详细

DS双向链表—祖玛

时间:2020-01-10 21:31:36      阅读:231      评论:0      收藏:0      [点我收藏+]

题目描述

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

 

输入

第一行是一个由大写字母‘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;
}

DS双向链表—祖玛

原文:https://www.cnblogs.com/SZU-DS-wys/p/12177959.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!