Nim游戏:取石头
(一)一堆取石头
背景:
在博弈论中,有一种称为Nim游戏的经典问题,它涉及到取石子的问题,其中有许多变种。Nim游戏是一种零和博弈,即两名玩家交替行动,每次只能从一堆物品中取走一定数量的物品,无法分割物品。
题目中描述的场景是这样的:
有n个石头,两名玩家轮流进行操作,每次可以从石头堆中取走1到m个石头(其中m是一个固定的正整数)。玩家可以根据自己的策略选择取多少个石头,目标是使自己取得最后一个石头。
题解思路:
令 ans = n%(m+1)(为什么这样令,后面会讲解)
判断是否存在先手必胜策略这一问题,即可一开始检验石子堆中的ans是否为0,当ans为0时,你面对的是ans==0的局面,你的任意操作都会使得当前ans不为0,你的对手又足够聪明,那你每执行一步,他都会再次把ans==0的局面返还给你,那你最后必输;
当ans不为0时,你先手,你又足够聪明,你每次执行后都可以把ans==0的局面留给对手,最后你必胜。
-
为什么令 ans = n%(m+1)?
当先手玩家取石头使石头个数 n 能够被(m+1)整除时,后手玩家所要面临的情况是:无论怎么取都不可能取完石头。如果先手玩家能够保证后手玩家一直面临石头个数 n 能够被(m+1)整除,那么最后一次,后手玩家面临的情况是:石头的个数是 m+1,所以后手玩家无论怎么取都不可能取完石头,最后只能是先手玩家将石头取完。
所以对于自己来说,取胜的条件是:自己面临的石头个数情况是 n%(m+1)!= 0;然后自己取石头使石头个数能够被(m+1)整数。
(二)多堆取石头:
这里我转载一位大佬的博客:博弈论石子游戏——nim 游戏_[模板]nim游戏_Wu_L7的博客-CSDN博客
题目描述:
地上有 n 堆石子(每堆石子数量小于 10^4),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 n 堆石子的数量,他想知道是否存在先手必胜的策略。
题目思路:
必胜策略,即当你执行最后一步后,你的对手已无石子可取,他必败你必胜。最后局面是地上各个石子堆已无石子可取,假设 ai 代表第 i 个石子堆中的石子数,则 ai = 0(i ≤ n)。即可得,a1^a2^a3^……^an=0(^表示异或),令ans = a1^a2^a3^……^an,要想必胜,说明最后的局面一定是ans==0,那我只需要满足,我每次操作完使得ans==0即可,那么每次留给对手的局面都是ans==0(怎么实现后面讲),并且石子的初始数确定,每次都取走一部分的石子,在有限的步数内肯定会取完,当执行到最后一步ans==0时,恰好最后的石子被你取完,你必胜。
那么,判断是否存在先手必胜策略这一问题,即可一开始检验石子堆中的ans是否为0,当ans为0时,你面对的是ans==0的局面,你的任意操作都会使得当前ans不为0,你的对手又足够聪明,那你每执行一步,他都会再次把ans==0的局面返还给你,那你最后必输;当ans不为0时,你先手,你又足够聪明,你每次执行后都可以把ans==0的局面留给对手,最后你必胜。
小tip:
为什么每次操作之后都会使得ans==0转化成ans != 0,并且足够聪明的你执行完一次操作之后又能把ans != 0变成ans==0?
1、ans==0执行一次操作之后为什么会转化为ans != 0?
异或,即是把每个ai中转化为二进制的形式,再对每一个位置的所有0和1进行异或操作,举个例子:5^3=6(0101^0011=0110)。而ans = a1^a2^a3^……^an,每次只能对一个石子堆操作,即每次操作只会影响ai(i ≤ n)中的一个,假设是对ak进行操作,则(没操作前的ak)^(其它ai的异或)==0,说明(其它ai的异或)==(没操作前的ak)(因为两个相同的数相异或结果才为0),现在对ak进行操作,则ak的值肯定会变化,其二进制形式也随之变化,则(操作后的ak)!=(其它ai的异或),所以(操作后的ak)^(其它ai的异或)!= 0,则ans != 0。
2、为什么足够聪明的你执行完一次操作之后又能把ans != 0变成ans==0?
ans = a1^a2^a3^……^an,是各个位置多个0和1的异或,因为ans != 0,说明一定有个别位置中1的个数为奇数,则我们可以把该位置上的1去掉一个或增加一个,即取走一些石头,使之为偶数,则ans==0。例如:10^5=15(1010^0101=1111),这是最经典的了,我们可以从10中拿走5,则5^5=0,所以想说明的是,总有办法使ans==0。
注:
这里有个简单的取石头个数的技巧(异或的简单计算方法):
例如:7和14的异或
7的二进制序列为: 0111
14的二进制序列为:1110
则异或结果是:1001 == 9
简便计算:
7可以写成2的倍数之和:4+2+1
14可以写成2的倍数之和:8+4+2+0
然后约去两部分相同的部分:7剩余一个1;14剩余一个8,再将剩余的数相加,其结果就是异或结果9。
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……
参考资料:
【尼姆游戏(学霸就是这样欺负人的)】https://www.bilibili.com/video/BV1ek4y1q7JD?vd_source=564abed1c36a31978eb9de7cdc6668d2
博客原文链接:https://blog.csdn.net/Wu_L7/article/details/126266519
同时感谢上面两位创作者的输出,让我受益匪浅。
相关文章:
Nim游戏:取石头
(一)一堆取石头 背景: 在博弈论中,有一种称为Nim游戏的经典问题,它涉及到取石子的问题,其中有许多变种。Nim游戏是一种零和博弈,即两名玩家交替行动,每次只能从一堆物品中取走一定数…...
springboot国际化
springboot国际化 不需要引入额外的jar包 参考:https://zhuanlan.zhihu.com/p/551605839 1.rources要创建Resource Bundle 2.yml配置中引入Resource Bundle 引入Resource Bundle spring:messages:encoding: UTF-8basename: i18n/messages_common3.创建国际化工具…...
12种不宜使用的Javascript语法
1. Javascript有两组相等运算符,一组是和!,另一组是和!。前者只比较值的相等,后者除了值以外,还比较类型是否相同。 请尽量不要使用前一组,永远只使用和!。因为默认会进行类型转换,规则十分难记。如果你…...
vue3+element-plus点击列表中的图片预览时,图片被表格覆盖
文章目录 问题解决 问题 视觉 点击图片进行预览,但还能继续选中其他的图片进行预览,鼠标放在表格上,那一行表格也会选中,如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…...
flutter:二维码生成与读取
前言 这csdn真的是服了,图片里有个二维码就直接变成违规图片了。至于效果的话,自己运行一下看看吧。 生成 flutter中生成二维码可以使用 qr_flutter。 官方文档 https://pub-web.flutter-io.cn/packages/qr_flutter 安装 flutter pub add qr_flutt…...
Camunda 7.x 系列【14】核心概念
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 流程定义1.1 Key1.2 版本1.3 挂起2. 流程实例3. 执行4. 活动实例5. 作业和作业定义本篇文…...
matplotlib 笔记:hist2d 2D直方图
创建二维直方图,用于显示数据分布的图表将数据划分成不同的区间(bin),并统计每个区间内数据点的数量 1 基本画法 默认bin的数量是10*10 N 1000 x np.random.randn(N) y np.random.randn(N) plt.hist2d(x, y) 2 修改bin的…...
数据库优化脚本执行报错
目录 一、执行数据库优化脚本 报错... 3 解决方法:... 4 1、直接注释掉RECYCLE_POOLS 赋值sql语句块... 4 2、手动修改脚本... 5 附录... 6 一、执行数据库优化脚本 报错 AutoParaAdj3.5_dm8.sql 1)manager中报错 -20001: 执行失败, -7065 数据未…...
TopN漏洞--sql注入
sql注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查…...
【论文阅读】UNICORN:基于运行时来源的高级持续威胁检测器(NDSS-2020)
UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats NDSS-2020 哈佛大学 Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020. 源码&…...
Linux的基本介绍和常用命令
Linux和Windows的主要区别 Linux和Windows是两种具有不同特性的操作系统,它们具有各自的优点和适用场景。选择哪一个操作系统主要取决于用户的需求、技术背景及使用场景等。 Linux和Windows的主要区别如下: 开源VS闭源:Linux是开源的系统&…...
Flutter 中
在Get状态管理库中,GetxController是一个用于管理状态和逻辑的基类。它具有一系列的生命周期方法,用于在不同的阶段执行相关的操作。下面是GetxController的生命周期方法及其执行顺序: onInit(): 这个方法在GetxController创建并加入到管理器…...
可视化高级绘图技巧100篇-总论
前言 优秀的数据可视化作品可以用三个关键词概括:准确、清晰、优雅。 准确:精准地反馈数据的特征信息(既不遗漏也不冗余,不造成读者疏漏&误读细节) 清晰:获取图表特征信息的时间越短越好 优雅&…...
Android AOSP源码编译——AOSP下载(一)
一、电脑配置 Ubuntu16.04 16G,硬盘的大小最好大于300G (我这边是找了个win电脑装了双系统 没有使用虚拟机的方式) 二、基础环境配置 1、安装git sudo apt install git配置git email和name git config --global user.email "youexample.com" git conf…...
Qt 文件对话框使用 Deepin风格
当你在Deepin或UOS 上开发 Qt 程序时,如果涉及到文件对话框功能,那么就会遇到调用原生窗口的问题。 如果你使用的是官方的Qt版本,那么在Deepin或者UOS系统上,弹出的文件对话框会是如下这样: 而Deepin或UOS系统提供的默…...
.net core 配置swagger
要在 ASP.NET Core 中配置 Swagger,您需要遵循以下步骤: 添加 Swagger NuGet 包:将 Swashbuckle.AspNetCore NuGet 包添加到项目中。 在 Startup.cs 文件中进行配置: using Microsoft.OpenApi.Models;public class Startup {// 省…...
leetcode707. 设计链表(单链表+虚拟头指针+双指针遍历)
题目:leetcode707. 设计链表 描述: 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链…...
电脑麦克风没声音?
这3招就可以解决! 在我们使用电脑录制视频时,有时会遇到一个令人头疼的问题:麦克风没有声音。那么,为什么会出现这种情况呢?更重要的是,我们应该如何解决这个问题呢?本文将介绍3种方法…...
React Native元素旋转一定的角度
mMeArrowIcon: {fontSize: 30, color: #999, transform: [{rotate: 180deg}]},<Icon name"arrow" style{styles.mMeArrowIcon}></Icon>参考链接: https://reactnative.cn/docs/transforms https://chat.xutongbao.top/...
LeetCode 1749. 任意子数组和的绝对值的最大值
【LetMeFly】1749.任意子数组和的绝对值的最大值 力扣题目链接:https://leetcode.cn/problems/maximum-absolute-sum-of-any-subarray/ 给你一个整数数组 nums 。一个子数组 [numsl, numsl1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl numsl1 ... nums…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
