组合数学——Nim取子游戏

<script></script>

Nim取子游戏是由两个人面对若干堆硬币(或石子)进行的游戏。设有k>=1堆硬币,各堆分别含有N 1,N 2,……N K枚硬币。游戏的目的就是选择最后剩下的硬币。游戏法则如下:
1.两个游戏人交替进行游戏(游戏人I和游戏人II);
2.当轮到每个游戏人取子时,选择这些堆中的一堆,并从所选的堆中取走至少一枚硬币(游戏人可以取走他所选堆中的全部硬币);
3.当所有的堆都变成空堆时,最后取子的游戏人即为胜者。
这个游戏中的变量是堆数k和各堆的硬币数N 1,N 2,……N k。对应的组合问题是,确定游戏人I获胜还是游戏人II获胜以及两个游戏人应该如何取子才能保证自己获胜(获胜策略)。
为了进一步理解Nim取子游戏,我们考查某些特殊情况。如果游戏开始时只有一堆硬币,游戏人I则通过取走所有的硬币而获胜。现在设有2堆硬币,且硬币数量分别为N 1和N 2。游戏人取得胜利并不在于N1和N2的值具体是多少,而是取决于它们是否相等。设N 1!=N 2,游戏人I从大堆中取走的硬币使得两堆硬币数量相等,于是,游戏人I以后每次取子的数量与游戏人II相等而最终获胜。但是如果N 1= N 2,则:游戏人II只要按着游戏人I取子的数量在另一堆中取相等数量的硬币,最终获胜者将会是游戏人II。这样,两堆的取子获胜策略就已经找到了。
现在我们如何从两堆的取子策略扩展到任意堆数中呢?
首先来回忆一下,每个正整数都有对应的一个二进制数,例如:57 (10)  à 111001 (2) ,即:57 (10)=2 5+2 4+2 3+2 0。于是,我们可以认为每一堆硬币数由2的幂数的子堆组成。这样,含有57枚硬币大堆就能看成是分别由数量为2 5、2 4、2 3、2 0的各个子堆组成。
现在考虑各大堆大小分别为N 1,N 2,……N k的一般的Nim取子游戏。将每一个数N i表示为其二进制数(数的位数相等,不等时在前面补0):
N = a s…a 1a 0
N = b s…b 1b 0
……
N = m s…m 1m 0
如果每一种大小的子堆的个数都是偶数,我们就称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。于是可得到如下一表:

23 = 8

22 = 4

21 = 2

20 = 1

大小为7的堆
0
1
1
1
大小为9的堆
1
0
0
1
大小为12的堆
1
1
0
0
大小为15的堆
1
1
1
1
由Nim取子游戏的平衡条件可知,此游戏是一个非平衡状态的取子游戏,因此,游戏人I在按获胜策略进行取子游戏下将一定能够取得最终的胜利。具体做法有多种,游戏人I可以从大小为12的堆中取走11枚硬币,使得游戏达到平衡(如下表),

23 = 8

22 = 4

21 = 2

20 = 1

大小为7的堆
0
1
1
1
大小为9的堆
1
0
0
1
大小为12的堆
0
0
0
1
大小为15的堆
1
1
1
1
之后,无论游戏人II如何取子,游戏人I在取子后仍使得游戏达到平衡。
同样的道理,游戏人I也可以选择大小为9的堆并取走5枚硬币而剩下4枚,或者,游戏人I从大小为15的堆中取走13枚而留下2枚。
归根结底,Nim取子游戏的关键在于游戏开始时游戏处于何种状态(平衡或非平衡)和第一个游戏人是否能够按照取子游戏的获胜策略来进行游戏。

组合数学——Nim取子游戏 太有趣了相关推荐

  1. cocos creator 大厅+子游戏模式探讨(creator版本1.8.2)

    之前一直从事android开发,接触cocos creator不久.近期公司安排我研究大厅子游戏模式的热更新,前后花了近一周时间,在论坛上查资料,请教大神,期间得到了一些帮助,在此很感谢cocos中文 ...

  2. 博弈论Nim取子问题,困扰千年的问题一行代码解决

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构专题26篇文章,我们来看看一个新的博弈论模型--Nim取子问题. 这个博弈问题非常古老,延续长度千年之久,一直到20世纪 ...

  3. Cocos Creator子游戏动态下载实现(大厅+子游戏模式)

    热更新 在App开发过程中,当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试.向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖 ...

  4. CocosCreator 2.4.3热更新实现方案(AssetBundle),大厅+子游戏模式快速实现

    _ 实现功能 项目环境 关于 Asset Bundle 实现过程 工程结构 快速使用代码 构建发布 Creator 构建 制作热更新资源 制作随包发布模块 测试功能 模块完整下载 windows下测试 ...

  5. 网狐荣耀6701/6801服务端 子游戏编译 部署

    1.前言 工作需要,接触到网狐的代码,因为没接触过vc和cocos经过一番才搭建起来,记录起来供大家参考. 服务端包括系统模块(协调服务器.聊天服务器.登录服务器.游戏服务器),网站(网狐前台.后台. ...

  6. 子游戏下载一半重新下载

    今天一朋友问我说子游戏下载一半又重新下载,给了他一份源码自己对比,还真找出来了. 是因为 定义问题,导致下载计算不正确.将原来是DWORD类型改成LONGLONG 行就可以了. 涉及文件:客户端组件\ ...

  7. 网狐子游戏二人牛牛机器人不起作用的解决办法

    今天编译二人牛牛,发现编译过程没有报错,一切正常,在后台添加游戏和机器人后一切正常,然后进入游戏,发现机器人占座后一直无反应.检查机器人设置后没发现什么问题.然后重新编译,看到有一句警告提示:warn ...

  8. CocosCreator大厅+子游戏+热更新方案

    转载自:https://www.jianshu.com/p/efee9f5937a3 前言 随着游戏的玩法越来越多,也就意味着包体越来越大,对于玩家来说,首次下载的包体就会越来越大,从而也会增加首次启 ...

  9. java游戏开发毕业论文_基于JAVA的五子游戏的开发设计毕业论文

    基于JAVA的五子游戏的开发设计毕业论文 毕业论文基于 JAVA 的五子游戏的开发设计山东凯文科技职业学院摘 要人工智能是一门正在迅速发展的新兴的,综合性很强的交叉科学.它与生物工程.空间技术一起被并 ...

最新文章

  1. R语言caret包构建xgboost模型实战:特征工程(连续数据离散化、因子化、无用特征删除)、配置模型参数(随机超参数寻优、10折交叉验证)并训练模型
  2. jquery php 异步图片上传实例,php结合jquery异步上传图片(ajaxSubmit)
  3. 高通android开源代码下载
  4. android重启时间变成1970,Android时间戳转字符串的1970问题
  5. 题目:[NOIP2008]火柴棒等式
  6. 控制反转IOC与依赖注入DI
  7. hive集群部署以及beeline和hive
  8. windows编程点滴(四)之线程的同步
  9. 安装卡主_智能温室四周玻璃的安装学问还这么多
  10. Python基础第一天
  11. 超几何分布_概率小题——分布列专题
  12. 服务器不删档的设置_CCD2服务器已经开启,准备好刷刷刷了吗
  13. Python 虚拟环境安装 ,避免影响生产环境。
  14. 安装python3.7的步骤_如何在Debian 9上安装Python 3.7?
  15. sqlmap自动化注入工具使用浅析
  16. 高数考研归纳 - 空间解析几何
  17. Kubernetes 在知乎上的应用
  18. 基于ssm+vue+elementui的的ktv点歌管理系统
  19. 计算机撤销英语,正在撤销对计算机所做的更改要等多久
  20. 5G助推全球新经济变革,十万亿产业研讨盛会等你来

热门文章

  1. 创维酷开系统14U系列8S26型号55寸智能电视实用玩机
  2. 摘抄-年轻人必学的1000个社会经验
  3. Attention SLAM:一种从人类注意中学习的视觉单目SLAM
  4. CYJian的水题大赛[第二弹] U34202 JerryC Loves Driving
  5. 2020.7 Hexo手把手教程(还带视频教程)
  6. 智能计算/计算智能/智能算法
  7. c++整人代码,“垃圾清理程序”
  8. HBase与Hive练习题
  9. 乌云漏洞库/知识库离线下载
  10. 2.23 使用python解析.bag数据集(无需虚拟机和ROS)