数据结构:“小猫钓鱼游戏”

一:题目

栈和队列的综合应用:“小猫钓鱼”的游戏规则是:将一副扑克牌平均分成两份,每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上,然后玩家乙也拿出手中的第一张扑克牌,并放在玩家甲刚打出的扑克牌的上面,就像这样两个玩家交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一个人手中的牌全部出完时,游戏结束,对手获胜。

要求编写程序来模拟这场游戏,并判断出谁最后获胜,获胜的同时打印出获胜者手中的牌以及桌上可能剩余的牌。(应用性设计内容)

为了简化实现,先做这样一个约定,玩家甲和乙手中牌的牌面值只有1-9。

测试样例(测试样例均采用输入前规定当前发牌数量的方式)

序号

输入

输出

1

请输入发牌数:6

玩家甲:2 4 1 2 5 6

玩家乙:3 1 3 5 6 4

游戏结束:玩家乙赢

玩家乙手中牌为:6 5 2 3 4 1

桌面上还有牌为:3 4 5 6 2 1

2

请输入发牌数:8

玩家甲:5 4 1 3 7 9 6 2

玩家乙:6 2 4 8 5 7 1 3

游戏结束:玩家乙赢

玩家乙手中牌为:4  1  2  4  5  7  8  3  6  5

桌面上还有牌为:9  7  6  1  2  3

3

请输入发牌数:9

玩家甲:3 4 5 6 2 1 8 7 9

玩家乙:6 5 2 3 4 1 9 7 8

游戏结束:玩家甲赢

玩家乙手中牌为:2  1  6  3  4  2  9  8  9  5  6  3  7  5

桌面上还有牌为:1  4  8  7

二:思想

1.玩家手中的牌可看成队列,桌上牌看成栈。

2.判断是否和桌上牌某张相同时,可用遍历,或设个buff数组,用下标代表牌,值代表在不在

 1代表在,0代表不在。如buff【1】=1,表示牌面为1的牌已经存在,需相关操作。

3.其他就是出栈入栈出队入队

三:代码

new可替换malloc delete替代free

#include<iostream>
using namespace std;
int buff[10] = { 0 };typedef int  QElemType;
typedef struct QNode
{QElemType data;struct QNode* next;
}QNode, * QueuePtr;
typedef struct
{QueuePtr front;QueuePtr rear;
}LinkQueue;
void initQueue(LinkQueue& q)
{q.front = new QNode;q.front->next = nullptr;q.rear = q.front;}
void pushQueue(LinkQueue& q, QElemType x)
{QueuePtr p = new QNode;p->data = x;p->next = nullptr;q.rear->next = p;q.rear = p;}
void popQueue(LinkQueue& q, QElemType& e)
{e = 0;QueuePtr p;if (q.rear == q.front) {return;}p = q.front->next;e = p->data;q.front->next = p->next;if (p == q.rear)q.rear = q.front;delete p;}
bool emptyQueue(LinkQueue& q)
{return q.front == q.rear;
}
QElemType gettopQueue(LinkQueue& q)
{if (emptyQueue(q)) {return -1;}else return  q.front->next->data;
}
void clearQueue(LinkQueue& q)
{while (q.front->next){QueuePtr p = q.front->next;q.front->next = p->next;delete p;}q.rear = q.front;
}
void destroyQueue(LinkQueue& q)
{while (q.front){q.rear = q.front->next;delete q.front;q.front = q.rear;}
}
void displayQueue(LinkQueue& q)
{if (emptyQueue(q)) {  return; }QueuePtr  p = q.front->next;while (p){cout << p->data; cout << " ";p = p->next;}
}
/// <summary>
/// /
/// </summary>typedef int SElemType;
#define minsize 100
typedef struct
{SElemType* base;SElemType* top;int stacksize;
}SqStack;
void initStack(SqStack& s)
{s.base = new SElemType[minsize];s.top = s.base;s.stacksize = minsize;
}
void pushStack(SqStack& s, SElemType x)
{if (s.top - s.base == s.stacksize) {SElemType* tmp = new SElemType[100];int i = 0;while (s.base != s.top) {tmp[i] = *s.top; i++;s.top++;}s.base = tmp;}*s.top = x;s.top++;
}
bool emptyStack(SqStack& s)
{return s.base == s.top;
}
void popStack(SqStack& s, SElemType& e)
{if (emptyStack(s)) {return;}e = *(s.top - 1);s.top--;}
void gettopStack(SqStack& s, SElemType& e)
{if (emptyStack(s)) {return;}e = *(s.top - 1);}
void clearStack(SqStack& s)
{SElemType e;while (!emptyStack(s)){popStack(s, e);}
}
void destroyStack(SqStack& s)
{delete[] s.base;s.base = s.top = nullptr;s.stacksize = 0;
}
void displayStack(SqStack S)
//输出顺序栈S中所有元素的值,顺序为从栈底到栈顶
{SElemType* p;if (S.base == S.top)               //如果栈空{printf("The Stack is NULL\n");return;}for (p = S.base; p < S.top; p++)cout << *p;cout << endl;}
void add(LinkQueue& q,SqStack& s,int e)
{pushQueue(q, e);int f;while (1){gettopStack(s, f);if (f == e) { pushQueue(q, e); popStack(s, f); buff[f] = 0; break; }pushQueue(q, f); popStack(s, f); buff[f] = 0;}
}
int main()
{LinkQueue q1, q2; initQueue(q1); initQueue(q2);cout << "请输入发牌数:";int n; cin >> n; int i = 0, j = 0,k=0;cout << "请给玩家甲发牌:";while (i != n){QueuePtr p = new QNode;cin >> p->data;pushQueue(q1, p->data); i++;}cout << "请给玩家乙发牌:";while (j != n){QueuePtr p = new QNode;cin >> p->data;pushQueue(q2, p->data); j++;}cout << "游戏开始:" << endl;cout << "玩家甲手里的牌为" << endl;displayQueue(q1); cout  << endl;cout << "玩家乙手里的牌为" << endl;displayQueue(q2); cout << endl;SqStack s;initStack(s);int e, f;while (k != n){if (emptyQueue(q1) || emptyQueue(q2)) break;popQueue(q1, e);if (buff[e] == 1) { add(q1, s, e); }else { buff[e] = 1; pushStack(s, e); }popQueue(q2, f);if (buff[f] == 1) { add(q2, s, f); }else {buff[f] = 1; pushStack(s, f);}}if (emptyQueue(q1)){cout << "游戏结束:玩家乙赢" << endl;cout << "玩家乙手里的牌为:"; displayQueue(q2);cout << "桌面上还有牌为:"; displayStack(s);}else{cout << "游戏结束:玩家甲赢" << endl;cout << "玩家甲手里的牌为:"; displayQueue(q1);cout << "桌面上还有牌为:"; displayStack(s);}return 0;
}

四:运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

采用Excel作为可视化设计器的开源规则引擎 NopRule

决策树和决策矩阵是业务人员可以直观理解的复杂IF-ELSE逻辑表达形式&#xff0c;也是规则引擎中最常用、最有用的部分。常见的规则引擎如Drools虽然提供了更加丰富的功能特性集&#xff0c; 特别是所谓的RETE算法可以用于高效复用多次重复出现的表达式片段&#xff0c;但在实际…

SpringSecurity + Jwt权限校验,接口调用403 Forbidden问题排查与解决

问题背景&#xff1a;部分接口调用正常&#xff0c;部分接口调用报403Forbidden&#xff0c;postman不显示具体报错信息。 问题描述&#xff1a; 接口调用报错&#xff0c;经排查&#xff0c;权限校验认证通过&#xff0c;可以进入接口&#xff0c;但是在执行过程中&#xff0…

【MySQL】提高篇—视图与存储过程:存储过程(Procedure)的创建与调用

在关系数据库中&#xff0c;存储过程&#xff08;Stored Procedure&#xff09;是一组预编译的 SQL 语句和可选的控制流语句&#xff08;如条件语句和循环语句&#xff09;&#xff0c;它们被存储在数据库中并可以被客户端应用程序或数据库用户调用。存储过程可以接受输入参数&…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

Java 线程池:深入理解与高效应用

在 Java 并发编程中&#xff0c;线程池是一种非常重要的技术。它可以有效地管理和复用线程&#xff0c;提高系统的性能和资源利用率。本文将深入探讨 Java 线程池的概念、原理、使用方法以及最佳实践&#xff0c;帮助读者更好地理解和应用线程池。 一、引言 在现代软件开发中&a…

高级SQL技巧掌握

高级SQL技巧掌握 在数据驱动的时代,掌握SQL不仅仅是为了解决具体问题,它更像是一把钥匙,帮助你打开数据分析的大门。你准备好提升你的SQL技能了吗?在这篇文章中,我们将一起探索十个必备的高级SQL查询技巧,这些技巧将帮助你更有效率地进行数据处理与分析。 1. 常见表表达…

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…

webpack 老项目升级记录:从 node-sass 限制的的 node v8 提升至支持 ^node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步&#xff1a;vue2 升级到最新 第一步&#xff1a;升级 vue2 至最新版本&#xff0c;截止到目前&#xff08;2024-10-…

解决RabbitMQ脑裂问题

文章目录 前言一、现象二、解决办法 前言 RabbitMQ脑裂 一、现象 RabbitMQ镜像群出现脑裂现象&#xff0c;各个节点的MQ实例都“各自为政”&#xff0c;数据并不同步。 二、解决办法 # 停止mq sh rabbitmq-server stop_app # 查看mq进程是否存在 ps -ef | grep rabbitmq # …

ATom:加州理工学院化学电离质谱仪(CIT-CIMS)的现场数据,V2版

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 ATom: In Situ Data from Caltech Chemical Ionization Mass Spectrometer (CIT-CIMS), V2 ATom&#xff1a;加州理工学院化学电离质谱仪&#xff08;CIT-CIMS&#xff09;的现场数据&#xff0c;V2版 简介 该数…

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案

前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s&#xff0c;感觉非常巴适&#xff0c;就研究了一下&#xff0c;首先遇到无法迁移老系统应用问题比较好解决&#xff0c;使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是&#xff1a;123456&#xff1b; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句&#xff0c;会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

Java设计模式之代理模式(二)

一、CGLIB动态代理 JDK动态代理要求被代理的类必须实现接口&#xff0c;有很强的局限性&#xff0c;而CGLIB动态代理则不要求被代理类实现接口。简单的说&#xff0c;CGLIB会让生成的代理类继承被代理类&#xff0c;并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。…

二叉树详解:类型、特性与应用

二叉树详解&#xff1a;类型、特性与应用 二叉树&#xff08;Binary Tree&#xff09;是计算机科学和数据结构中的核心构造&#xff0c;广泛用于多种算法和系统的实现。其每个节点最多有两个子节点&#xff0c;即左子节点和右子节点。尽管其结构表面上相对简单&#xff0c;二叉…

在 Gitee 或 GitCode 上克隆 Dify 项目源码并启动 Docker 环境

在 Gitee 或 GitCode 上克隆 Dify 项目源码并启动 Docker 环境 第一步&#xff1a;克隆源码仓库 首先&#xff0c;使用以下命令将项目克隆到本地&#xff0c;确保您已经在 Gitee 或 GitCode 上配置了 SSH 密钥&#xff1a; git clone gitgitcode.com:Mingcai_Xiong/dify-cop…

git的学习之远程进行操作

1.代码托管GitHub&#xff1a;充当中央服务器仓库的角色 2.git远程进行操作 3.配置本地服务器的公钥 4.推送 5.git远程操作 pull .gitignore 6.给命令配置别名 git config --global alias.st status 7.标签管理 git tag -a [name] -m "XXX" [commit_id] 操作标签…

基于Python的自然语言处理系列(46):4-bit LLM 量化与 GPTQ

在本篇文章中&#xff0c;我们将深入探讨如何使用 GPTQ (Generative Pre-trained Quantization) 进行4-bit大语言模型(LLM)的量化。在大规模语言模型训练和推理的背景下&#xff0c;模型的量化不仅能够大大降低计算成本&#xff0c;还能够提高推理速度&#xff0c;因此对构建高…

正则表达式使用举例一(Python下)

目录 1 问题描述2 解决2.1 问题1的解决2.2 问题2的解决 摘要&#xff1a;本文给出了一个在Python语言中利用re包进行正则表达式匹配计算的例子。详细讲述了所写的正则表达式的含义&#xff0c;还对搜索结果对象的span()函数进行运用举例&#xff0c;从而成功提取出原字符串中的…

查找与排序-插入排序

1.直接插入排序的基本思想 假设n个数据元素关键字存储在静态数组a中&#xff0c;则直接插入排序的基本思想可做如下描述&#xff1a; &#xff08;1&#xff09;初始有序子序列由一个元素a[0] 组成&#xff1b; &#xff08;2&#xff09;从a[1]开始&#xff0c;对于序列中每…

安卓屏幕旋转(TODO)

要对整个安卓系统实现实时旋转&#xff0c;无论设备如何旋转&#xff0c;屏幕始终与设备的物理方向保持一致&#xff0c;涉及到修改 Android 系统级别的显示设置和传感器处理。这种需求不单单在应用层实现&#xff0c;而是需要对 Android 系统的 **frameworks** 和 **display s…