Nim游戏(初谈博弈)

 通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,
如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

*这游戏看上去有点复杂,先从简单情况开始研究吧。
如果轮到你的时候,只剩下一堆石子,
那么此时的必胜策略肯定是把这堆石子全部拿完一颗也不给对手剩,然后对手就输了。

*如果剩下两堆不相等的石子,必胜策略是通过取多的一堆的石子将两堆石子变得相等,
以后如果对手在某一堆里拿若干颗,你就可以在另一堆中拿同样多的颗数,直至胜利。
如果你面对的是两堆相等的石子,那么此时你是没有任何必胜策略的,
反而对手可以遵循上面的策略保证必胜。

*现在我们如何从两堆的取子策略扩展到任意堆数中呢?

*首先来回忆一下,每个正整数都有对应的一个二进制数,
于是,我们可以认为每一堆硬币数由2的幂数的子堆组成。
这样,含有57枚硬币大堆就能看成是分别由数量为2^5、2^4、2^3、2^0的各个子堆组成。

*现在考虑各大堆大小分别为N1,N2,……Nk的一般的Nim取子游戏。
将每一个数Ni表示为其二进制数(数的位数相等,不等时在前面补0):

N1 = as…a1a0

N2 = bs…b1b0

……

Nk = ms…m1m0

如果每一种大小的子堆的个数都是偶数,我们就称Nim取子游戏是平衡的,

而对应位相加是偶数的称为平衡位,否则称为非平衡位。

因此,Nim取子游戏是平衡的,当且仅当:

as + bs + … + ms 是偶数

……
a1 + b1 + … + m1 是偶数

a0 + b0 + … + m0是偶数

于是,我们就能得出获胜策略:

游戏人I能够在非平衡取子游戏中取胜,而游戏人II能够在平衡的取子游戏中取胜。

*我们以一个两堆硬币的Nim取子游戏作为试验。设游戏开始时游戏处于非平衡状态。
这样,游戏人I就能通过一种取子方式使得他取子后留给游戏人II的是一个平衡状态下的游戏,
接着无论游戏人II如何取子,再留给游戏人I的一定是一个非平衡状态游戏,如此反复进行,
当游戏人II在最后一次平衡状态下取子后,游戏人I便能一次性取走所有的硬币而获胜。
而如果游戏开始时游戏牌平衡状态,那根据上述方式取子,最终游戏人II能获胜。

*下面应用此获胜策略来考虑 4堆 的Nim取子游戏。
其中各堆的大小分别为7,9,12,15枚硬币。
用二进制表示各数分别为:0111,1001,1100和1111。于是可得到如下一表:
这里写图片描述
由Nim取子游戏的平衡条件可知,此游戏是一个非平衡状态的取子游戏,
因此,游戏人I在按获胜策略进行取子游戏下将一定能够取得最终的胜利。
具体做法有多种,游戏人I可以从大小为12的堆中取走11枚硬币,使得游戏达到平衡(如下表),
这里写图片描述
之后,无论游戏人II如何取子,游戏人I在取子后仍使得游戏达到平衡。
同样的道理,游戏人I也可以选择大小为9的堆并取走5枚硬币而剩下4枚,
或者,游戏人I从大小为15的堆中取走13枚而留下2枚。

所以归根结底,Nim游戏的核心就是判断初始状态是不是平衡状态
非平衡状态先手必胜,平衡状态后手必胜

转载于:https://www.cnblogs.com/wutongtong3117/p/7673588.html

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

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

相关文章

android 如何使用aar,Android Studio如何使用aar依赖包?

ps:2013-12-25 号更新,升级到0.4以后 这种方法已经完美使用!因为项目里面要用到actionbarsherlock,所以研究了一下如何导入到android studio中。arr(Android Archive):名字是谷歌到的,至于中文叫什么我也不知道。不过好像依赖都要…

第二百七十九节,MySQL数据库-pymysql模块操作数据库

MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式:   模块名称.connect()   参数:   host数据库ip   port数据库端口   user数据库用户名   pa…

宇航员能用GPS在月球上导航吗?美国宇航局的科学家给出了肯定答案

Illustration: NASA来源:IEEE电气电子工程师如果宇航员按照美国宇航局Artemis计划登录月球,他们的主要目标之一就是在月球南极附近的陨石坑中挖冰,这些冰层不仅对水有用,而且可以分解成氢和氧。但它们需要导航,才能精确…

android getdecorview 出现空指针,android – 为什么我从TabWidget得到一个空指针异常?...

我正在编写一个android程序,其中我有一个使用制表符的活动.活动public class UnitActivity extends TabActivity {Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TabHost tabHost getTabHost();TabSpec spec;Resources res …

react多个网络请求_如何优雅的在react-hook中进行网络请求

本文将介绍如何在使用React Hook进行网络请求及注意事项。前言Hook是在React 16.8.0版本中新加入的特性,同时在React-Native的0.59.0版本及以上进行了支持,使用hook可以不用class的方式的方式使用state,及类似的生命周期特性。本片文章通过简…

JS之代理模式

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Document</title>6 </head>7 <body>8 <script>9 //1,买家 10 function maijia (argument) …

猴子会照镜子吗?科学家的这一研究意义非凡!

来源&#xff1a;中国经济大讲堂本期提要在《中国经济大讲堂》演讲中&#xff0c;中国科学院院士、中科院脑科学与智能技术卓越创新中心学术主任蒲慕明指出&#xff0c;自闭症患者、严重脑疾病可能伴有自我意识损伤的现象。我们通过各种训练方法&#xff0c;可以使猴子学会识别…

博客开篇。

【README.MD】: this is a blog for 13203361793163.com. just about HTML 、Css 、 JavaScript and a little PHP. Practice is most important to learn and master all knowledge, only in this way , can we make our career better and better . 转载于:https://www.cnbl…

Science | 闵明玮等揭示细胞如何做出命运决定

来源&#xff1a;BioArt细胞命运决定我们体内的每个细胞都会面临着一个关乎命运的选择&#xff1a;要不要复制产生一个新的细胞。这个重大选择关系到人体发育和维持稳态等生理过程&#xff0c;因此它的失调也与癌症等疾病的发生发展有着密切联系。在人体中&#xff0c;大部分的…

itext html 转换 pdf文件,利用itext实现html转pdf文档

Link: http://keyknight.blog.163.com/blog/static/366378402009431104941637/利用itext实现html转pdf文档的代码实在是太简单了&#xff1a;Document pdf new Document(PageSize.A4, 50, 50, 50, 50);try {PdfWriter.getInstance(pdf, new FileOutputStream("d:/t.pdf&q…

图解机器学习:人人都能懂的算法原理

来源&#xff1a;机器学习研究组订阅号算法公式挺费神&#xff0c;机器学习太伤人。任何一个刚入门机器学习的人都会被复杂的公式和晦涩难懂的术语吓到。但其实&#xff0c;如果有通俗易懂的图解&#xff0c;理解机器学习的原理就会非常容易。本文整理了一篇博客文章的内容&…

python gil锁问题_Python的GIL与线程安全问题?[closed]

由于一些历史原因&#xff0c;CPython的GIL使得Python同一个时刻只能有一个线程在运行&#xff0c;这使得线程只能用于IO型任务&#xff0c;虽然异步更胜一筹。但是既然同一个时刻只能有一个线程运行那为什么还会有线程安全&#xff0c;线程非安全之类的概念。threading模块提供…

html5页面主题,HTML5页面开发笔记

页面由设计决定, 所以首先聊聊设计稿前戏, 页面设计规范PSD设计稿的图层 "分组" 以及图层 "命名":设计稿中的每一个元素, 比如 唱片机, 设计师需要将所有属于唱片机的图层全部打到一个图层组里, 并且命名这个图层组为唱片机.这样开发人员可以快速的去单独导…

AC日记——Mato的文件管理 bzoj 3289

3289 思路&#xff1a; 莫队求区间逆序对个数&#xff0c;树状数组维护&#xff1b; 代码&#xff1a; #include <bits/stdc.h> using namespace std; #define maxn 50005 int bel[maxn],blo; struct QueryType {int l,r,id;bool operator<(const QueryType pos)const…

Python 什么时候会被取代?

来源&#xff1a;CSDN译者 | 弯月&#xff0c;责编 | 郭芮以下是译文&#xff1a; Python经过了几十年的努力才得到了编程社区的赏识。自2010年以来&#xff0c;Python得到了蓬勃发展&#xff0c;并最终超越了C、C#、Java和JavaScript。但是&#xff0c;这种趋势将持续到什么时…

java负数右移_Java中的按位右移运算符 - Break易站

在C / C 中&#xff0c;只有一个右移运算符>>&#xff0c;它只能用于正整数或无符号整数。在C / C 中不推荐使用右移运算符来表示负数&#xff0c;当用于负数时&#xff0c;输出依赖于编译器。与C 不同&#xff0c;Java支持以下两个右移操作符。Java中的按位右移运算符1)…

Android开发艺术探究Note

第一章&#xff1a;Activity的生命周期和启动模式 生命周期onPause表示activity正在停止&#xff0c;onPaus必须先执行完&#xff08;栈顶的activity&#xff09;&#xff0c;新的activity的onResume才会执行。onStop表示activity即将停止&#xff08;透明不会执行&#xff09;…

html设置焦点图片,HTML设置焦点

**插件简介**这是一款很有特点的HTML5图片切换焦点图动画&#xff0c;点击左右按钮即可将图片进行弹性切换&#xff0c;图片在被切换时&#xff0c;都会左右晃动几下&#xff0c;产生一定的弹性缓冲动画效果。[contenteditable]:focus{outline: none;}如果input失去焦点时,有进…

烧脑:宇宙时空结构是量子纠错码

来源&#xff1a;Future远见现在越来越多的理论物理学家开始相信&#xff0c;时空起源于纠缠的量子信息。粗略地讲&#xff0c;时空中最重要的“相邻”概念&#xff0c;可以认为是起源于量子纠缠&#xff1a;有纠缠就是相邻&#xff0c;没有纠缠就是不相邻。如果你相信这一观念…

dataframe 取2列_DataFrame通过两列进行分组,并获取另一列的计数

新手程序员在这里寻求帮助。我有一个看起来像这样的数据框&#xff1a;Cashtag Date Message0 $AAPL 2018-01-01 "Blah blah $AAPL"1 $AAPL 2018-01-05 "Blah blah $AAPL"2 $AAPL 2019-01-08 "Blah blah $AAPL"3 $AAPL 2019-02-09 "Blah bl…