C++ 21 点游戏2025年3月25日 | 阅读 13 分钟 Nim 21 游戏 是 Nim 的一个变体,Nim 是经典的数学游戏,用于例证组合博弈论原理。在 Nim 游戏中,赢得者拿走最后一个物品;其他变体则要求玩家从集合中拿走物品,目标是永远不拿走最后一个。在 Nim 21 游戏中,玩家以 21 个物品开始,在每一轮中,可以拿走一个、两个或三个物品。因为会迫使输家拿走最后一个物品,所以需要策略性思考。 目标是将对方置于不利位置,使其被迫拿走最后一个物品。它有助于理解逻辑策略,这些策略也可以应用于计算机化形式。 游戏策略Nim 21 游戏有趣之处在于其数学策略是固有的。获胜策略是让对手处于一个剩下物品数量仍是 4 的倍数的位置。这将保证,无论对手拿走 1、2 或 3 个物品中的哪一个,玩家都将迫使对手在下一轮离开 4 的倍数。关键在于,当对手轮到他们时,他们会留下正好 4 个物品;这是对先手的玩家来说不可避免的胜利之路。当双方都知道最优策略时,游戏是确定性的。 Nim 21 游戏展示了博弈论的基本主题:获胜策略和最优走法。应注意的是,它们利用了循环和条件语句,并能够处理输入输出。这是一个很好的例子,说明如何将简单的逻辑策略以代码形式编写,也适合编程初学者,因为任何人都可以理解它的工作原理以及每个部分如何组合在一起。 方法一:基本暴力破解方法基本暴力破解方法是玩 Nim 21 游戏的直接方式,适合初学者。在此方法中,玩家进行随机走法(忘记策略规划),在允许范围内拿走 1、2 或 3 个物品。由于缺乏策略,这种游戏结果不可预测,并且当我们不考虑玩家的选择如何影响对手的走法时,通常会导致次优结果。 这种方法是一个很好的学习练习,需要基本的编程概念,如循环、条件语句和输入处理。它一直进行,直到迫使一名玩家拿走最后一个物品并输掉。这种方法的优点在于我们可以学习编码,而无需先掌握该特定领域。 程序让我们以一个例子来说明如何使用基本暴力破解方法在 C++ 中实现 Nim 21 游戏。 输出 Welcome to the Nim 21 Game! The rules are simple: 1. We start with 21 items. Each turn, you can remove 1, 2, or 3 items from the total. 2. The player who is forced to take the last item loses the game. 3. Take turns with the computer until only one item remains. Let's begin! The starting total is 21. Current total remaining: 21 The game continues! Try not to leave yourself in a losing position. Your turn! Please enter 1, 2, or 3 to reduce the total: 2 You chose to reduce the total by 2. You reduced the total to 19 by removing 2 items. Now it's the computer's turn to play... Current total remaining: 19 The game continues! Try not to leave yourself in a losing position. Computer's turn! It decides to reduce the total by 1. The computer reduced the total to 18 by removing 1 items. Current total remaining: 18 The game continues! Try not to leave yourself in a losing position. Your turn! Please enter 1, 2, or 3 to reduce the total: 2 You chose to reduce the total by 2. You reduced the total to 16 by removing 2 items. Now it's the computer's turn to play... Current total remaining: 16 The game continues! Try not to leave yourself in a losing position. Computer's turn! It decides to reduce the total by 1. The computer reduced the total to 15 by removing 1 items. Current total remaining: 15 The game continues! Try not to leave yourself in a losing position. Your turn! Please enter 1, 2, or 3 to reduce the total: 说明
此代码提供了控制结构、输入验证和输出消息的基础知识,创建了一个易于初学者理解和遵循的交互式游戏。 复杂度分析时间复杂度 1. 主游戏循环 现在,主 while 循环会一直运行,直到总数(从 21 开始)小于或等于 1。每个玩家每回合拿走 1、2 或 3 个物品,因此我们最多有 21 次迭代(最坏情况是每回合只拿走一个物品)。 然而,玩家拿走的每个物品允许最多拿走 3 个物品。这使得预期的迭代次数减少到大约 7-10 次,平均而言。在这种情况下,游戏循环的时间复杂度为 O(n),其中 n 是初始总数(21)。 2. 玩家和计算机走法 在每种情况下,计算机都会取一个随机数(对于计算机的走法)或验证输入(对于玩家的走法)。O(1):这些操作是常数时间。 每次输赢检查和 displayStatus 函数都是 O(1) 操作,整个过程都是 O(1)。 总体而言,如果我们持续计算每一步可以拿走多少物品,我们会发现这种暴力破解方法总的时间复杂度为 O(n),其中 n 是物品的初始总数。 空间复杂度 1. 变量 代码使用固定数量的整数 变量(total、playerMove、computerMove),空间复杂度为 O(1)。 2. 函数调用 getComputerMove 和 getPlayerMove 函数会被重复调用,并且只需要 O(1) 空间,因为它们不需要任何额外的数据结构。 由于没有额外用于存储的 数据结构,空间复杂度为 O(1)。 方法二:最优策略(4 的倍数)游戏理论上为玩 Nim 21 确立了获胜阶段,并且 4 的倍数是明确的。这种策略包括知道我们的获胜策略始终是在每次走法结束时给对手留下一个 4 的倍数。达到一个总数减少到 4 的倍数,这意味着对手必须拿走 1、2 或 3 个物品。他们最终会陷入一个失败的位置只是时间问题。 为此,我们在整个游戏中保持此策略,以便玩家永远不会拿走最后一个物品,而是将对手置于一个被迫走法的境地,他们将不得不拿走最后一个物品以赶上。此策略保证了理解并遵循此策略的玩家将获胜。这是一种简单但非常好的技术,如果我们先手,它将始终确保我们获胜。 程序让我们以一个例子来说明如何使用最优策略在 C++ 中实现 Nim 21 游戏。 输出 Welcome to the Nim 21 Game! The objective of the game is to avoid being the player who takes the last item. You can take 1, 2, or 3 items on your turn. The game starts with 21 items, and you will play against the computer. Good luck! Current total: 21 items left. Your turn! How many items would you like to take? (1, 2, or 3): 1 You took 1 item(s). 20 item(s) remaining. Computer's turn... The computer randomly decides to take 1 item(s). The computer took 1 item(s). 19 item(s) remaining. Current total: 19 items left. Your turn! How many items would you like to take? (1, 2, or 3): 说明
复杂度分析时间复杂度
空间复杂度
|
引言:“重新排列远程条形码”是计算机科学领域,尤其是在算法设计和优化中经常遇到的一个计算问题。挑战在于重新组织条形码序列(由整数表示),使得没有两个相邻的条形码相同。这个问题类似于寻找...
阅读 15 分钟
在本文中,您将通过几个示例了解如何使用 C++ 中的 DSU 检测图中的循环。图:图是由节点(顶点)和连接节点对的边组成的集合。图可以是定向的或非定向的,并且可以分配权重……
阅读20分钟
在本文中,我们将讨论 C++ 中二进制字符串的最长非递增子序列。引言:最长非递增子序列 (LNIS) 的目标通常是找到二进制字符串中最长的非递减或保持不变的子序列的长度……
5 分钟阅读
分形排序是一种非比较排序算法,它以与分形相同的方式应用分治策略。但是,分形排序的用途相对较少,与 Quicksort 等知名算法相比,其讨论和分析的频率较低……
14 分钟阅读
抽样在数据科学和统计学中发挥着作用,它使我们能够从更大的总体中提取子集。一种有效的方法是水库抽样,它涉及从大小为 (n) 的数据集或流中选择固定数量的项目 (k)。本文旨在介绍... ...
阅读 6 分钟
在本文中,我们将讨论其语法和示例。简介 一个强大的 C++ 工具 std::regex_replace 使程序员能够使用正则表达式查找和替换文本。它是一种搜索字符串中的模式并替换该模式实例的有用方法...
5 分钟阅读
C++ 是由 Bjarne Stroustrup 设计的广泛使用且强大的强类型语言,是 C 语言的改进版本。C++ 在处理系统资源方面具有相当大的能力,可用于过程式和面向对象编程,并允许在活动中应用...
阅读 6 分钟
在当今计算领域,处理的数据量和算法的复杂性不断增加,优化内存访问已变得至关重要。优化过程中最核心的挑战在于高效利用计算机的内存层次结构,特别是缓存。...
阅读 15 分钟
在本文中,我们将讨论如何在 C++ 中查找哈希冲突的索引,并提供几个示例。问题陈述:假设我们有一个数字 a 和一个包含 n 个元素的数组 P。有一个带有 'a' 个桶的哈希表...
5 分钟阅读
第 n 个 Fuss-Catalan 数是一个非常有趣的数学概念,它扩展了标准的 Catalan 数到更广义的形式。它在组合学、几何学和计算机科学中具有重要的应用。本文将讨论数学背景、应用以及一个高效的 C++ 程序...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India