通常的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

Nim游戏(初谈博弈)相关推荐

  1. #1163 : 博弈游戏·Nim游戏(数学博弈)

    #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样 ...

  2. Nim游戏 —— 巴什博弈

    巴什博弈 对于这道题来说,如果我们拿到n为(3+1)*x,那么这局败,否则胜(x为大于零的整数) 解释:对于拿到(3+1)*x的一方来说,无论取1.2.3,对方都可以把控制石子数使己方拿到(3+1)* ...

  3. hihoCoder#: 博弈游戏·Nim游戏

    [题目链接]:click here~~ [题目大意]: #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,A ...

  4. 博弈游戏·Nim游戏·二

    题目1 : 博弈游戏·Nim游戏·二 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏: N枚硬币排成一列,有的正面 ...

  5. 【小组专题二:博弈论入门综述(1)】NP状态 | SG函数 | 巴什博奕、威佐夫博弈、斐波那契博弈、Nim游戏、SJ定理

    博弈论综述[1] 前言 博弈与博弈论 博弈树 NP状态 SG函数(Sprague-Grundy) Sprague-Grundy Theorem 巴什博奕 Bash Game 威佐夫博弈 扩展威佐夫博弈 ...

  6. python博弈树_简单博弈树算法(nim游戏)

    简单博弈树算法(nim游戏)的python实现. import random import treelib import sys tagid=0 def genId(): global tagid t ...

  7. (转载)Nim游戏博弈(收集完全版)

    Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输. 后来,在一份资料上看到,这种游戏称为"拈(Nim) ...

  8. Nim 游戏 、⽯头游戏1、石头游戏2

    Nim 游戏 .⽯头游戏1.石头游戏2 文章目录 Nim 游戏 .⽯头游戏1.石头游戏2 **一:Nim 游戏** **二:⽯头游戏** **三.石头游戏2** **方法一:DP 函数** **方法二 ...

  9. 拟阵:贪心原理(bzoj 3105: [cqoi2013]新Nim游戏)

    拟阵:贪心算法的理论基础 拟阵是满足下列条件的一个序队M = (S, I) ①S是一个有穷的集合,I是集合的集合且非空 ②I具有遗传性质:如果集合B∈I 且 A⊂B,则A∈I,即若B∈I,则B是S的独 ...

最新文章

  1. 编码过程中的问题总结
  2. 证明kruskal算法求解图的最小生成树具有贪心选择性质_将并查集应用在图论中的最小生成树算法——Kruskal...
  3. 2018ACM/ICPC亚洲区域赛(焦作)F. Honeycomb
  4. react hoc_如何使用HOC模式开发React超能力
  5. c语言考试系统开发,基于WEB的(C语言)网络考试系统的开发与研究
  6. 变量的解构赋值(对象)
  7. 尼康数码相机照片数据恢复怎么办
  8. [Unity3D] DOTween和Curvy插件,以及UI-Extension
  9. 计算机基础知识问卷,计算机基础知识情况问卷调查
  10. iscsi对oracle发起程序,windows_2008+Oracle_11g_R2_配置完整版
  11. jtest准考证打印
  12. PDF文档在线翻译怎么操作
  13. 算法与数据结构-分治法
  14. c++ bitset类用法
  15. 我收藏的短线操作技巧
  16. HEVC代码学习42:estIntraPredLumaQT函数
  17. springboot+神奇桔乡旅游信息系统 毕业设计-附源码191750
  18. 07 C++简单应用 编写一个摄氏度转华氏摄氏度的函数
  19. 利用CSS3动画让图片动起来
  20. 买低配车,更保值?!坊间有一句戏言:买车都要买低配

热门文章

  1. 【Pytorch神经网络理论篇】 16 过拟合问题的优化技巧(三):批量归一化
  2. python长沙_长沙python
  3. 五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)
  4. 使用RNN预测文档归属作者
  5. LeetCode 296. 最佳的碰头地点(坐标独立+中位数的地方最近)
  6. LeetCode 249. 移位字符串分组(哈希)
  7. TCP协议以及三次握手
  8. mask属性是css3的吗_使用CSS3 mask(蒙版,遮罩)属性实现超酷按钮悬停动画
  9. 预训练模型对实体的表示能力差?一个简单有效的解法来了!(开源)
  10. 打脸!一个线性变换就能媲美“最强句子embedding”?