清华数据结构PA02 祖玛(zuma)

      这是第三章列表(list)所对应的problem assignment,贴出text:描述祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记
摘要由CSDN通过智能技术生成

这是清华大学邓公的数据结构第三章列表(list)所对应的problem assignment,贴出text:

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

开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能,而回放功能的实现则委托你来完成。

游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。

输入
第一行是一个由大写字母’A’~'Z’组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。

第二行是一个数字n,表示整个回放过程共有n次操作。

接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母Σ描述,以空格分隔。其中,Σ为新珠子的颜色。若插入前共有m颗珠子,则k ∈ [0, m]表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序。

输出
输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。

如果轨道上已没有珠子,则以“-”表示。

样例
输入

ACCBA
5
1 B
0 A
2 B
4 C
0 A

输出

ABCCBA
AABCCBA
AABBCCBA
-
A

限制
0 ≤ n ≤ 10^4

0 ≤ 初始珠子数量 ≤ 10^4

时间:2 sec

内存:256 MB

      这是一道模拟类的算法题,简而言之就是题目给出流程,用代码实现即可。这道题的大体思路不是很难,最主要的消除算法可以采用多指针遍历的思路。但是这题的坑点很多。一是要特判输入为空的情形(没错,就是你玩一局祖玛点了开局,然后发现管道里一个球都没有的情况),其二是祖玛不一定是三消,有可能是四个同色的消除,如果采用的是三指针遍历的话,发现三个指针指向的珠子同色时,一定要考虑最右端或者左端之外的第一个珠子是否还是同色的。

      下面贴出本人的代码,但是是有问题的:

#include <cstdio>
#define INPUT_SIZE 10086

typedef struct ListNode //链表结点
{
   
    char m_data;
    ListNode* m_predecessor;
    ListNode* m_successor;

    ListNode() : m_data('A'), m_predecessor(nullptr), m_successor(nullptr) {
   }     //默认构造方法

    ListNode* getSuccessor(void) const {
    return m_successor; }
    ListNode* getPredecessor(void) const {
    return m_predecessor; }
}ListNode;

class List
{
   
private:
    int m_size;
    ListNode* m_header;
    ListNode* m_trailer;

public:
    List() : m_size(0)   //默认构造方法
    {
   
        m_header = new ListNode();  m_trailer = new ListNode();
        m_header->m_successor = m_trailer;  m_trailer->m_predecessor = m_header;
    }

    ~List() //析构
    {
   
        while(0 < m_size)   remove(m_header->getSuccessor());
        delete m_header;    m_header = nullptr;
        delete m_trailer;   m_header = nullptr;
    }

    ListNode* insertAsLast(const char& _data)   //插入,用作于初始化扩容
    {
   
        ListNode* inserted = new ListNode();
        //新的插入节点的链接
        inserted->m_data = _data;
        inserted->m_predecessor = last();   inserted->m_successor = m_trailer;
        m_trailer->m_predecessor->m_successor = inserted; m_trailer->m_predecessor = inserted
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值