前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DS双向链表—祖玛 C++

DS双向链表—祖玛 C++

作者头像
叶茂林
发布2023-07-30 11:28:00
2170
发布2023-07-30 11:28:00
举报
文章被收录于专栏:叶子的开发者社区

温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。

题目描述

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

给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。

输入

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

思路分析

原本想用list容器做的,发现它不是很好用,还是用自己写的List吧。

这道题关键在于消除,首先要注意到是三个或三个以上都能消,所以去判断连续三个或四个甚至五个的方法是不行的,所以我的解决方法是先去数有多少个相同的,大于等于三个的才去消除,因为有可能会出现连环反应,所以必须写成循环,每次先判断有没有大于等于三个的,消除到没有再退出循环。

AC代码 

代码语言:javascript
复制
#include <iostream>
using namespace std;
class Node {
	public:
		char data;
		Node * next = NULL;
};
class List {//带头结点的单链表,位置从0到n,0是头结点,1是首结点,n是尾结点
	public:
		Node * head; //头结点
		int size; //表长
		List();		//构造函数,创建头结点
		~List();	//析构函数,逐个结点回收
		int Insert(char item, int i);	//第i位置插入元素,操作成功或失败返回OK或ERROR
		void print();//打印单链表所有数据
		int get(int i) {
			Node*p = head->next;
			int j = 1;
			while (j++ < i) {
				p = p->next;
			}
			return p->data;
		}
		int del(int i) {
			Node*p = head, *q = head->next;
			int j = 1;
			while (j++ < i) {
				p = p->next;
				q = q->next;
			}
			p->next = q->next;
			delete q;
			size--;
			return 0;
		}
		int same(int i) {
			int count = 1;
			Node*p = head->next;
			int j = 1;
			while (j++ < i) {
				p = p->next;
			}
			while (p && p->next) {
				if (p->data == p->next->data) {
					count++;
					p = p->next;
				} else break;
			}
			return count;
		}
};
List::List(): size(0) {
	head = new Node();
}
List::~List() {
	Node *p, *q;
	p = head->next;
	while (p != NULL) {
		q = p;
		p = p->next;
		delete q;
	}
	size = 0;
	head->next = NULL;
}
int List::Insert(char item, int i) {
	Node*p = head;
	int j = 0;
	while (j++ < i) {
		p = p->next;
	}
	Node*q = new Node();
	q->data = item;
	q->next = p->next;
	p->next = q;
	size++;
	return 0;
}
void List::print() {
	Node*p = head->next;
	if (p)
		for (int i = 1; i <= size; i++) {
			cout << p->data;
			p = p->next;
		} else cout << '-';
	cout << endl;
}
void Yezi(List&zuma) {
	int flag = 1;
	while (flag) {
		flag = 0;
		for (int i = 1; i < zuma.size - 1; i++) {
			int count = zuma.same(i);
			if (count > 2) {
				flag = 1;
				while (count--)
					zuma.del(i);
			}
		}
	}
}
int main() {
	string temp;
	cin >> temp;
	List zuma;
	for (int i = 0; temp[i]; i++)
		zuma.Insert(temp[i], i);
	int n, pos;
	char bead;
	cin >> n;
	while (n--) {
		cin >> pos >> bead;
		zuma.Insert(bead, pos);
		Yezi(zuma);
		zuma.print();
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • AC代码 
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档