Nim博弈
来源:互联网 发布:yum nothing to do 编辑:程序博客网 时间:2024/05/21 17:57
转自https://hrbust-acm-team.gitbooks.io/acm-book/content/game_theory/nimbo_yi.html
简述
通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。
分析
这游戏看上去有点复杂,先从简单情况开始研究吧。如果轮到你的时候,只剩下一堆石子,那么此时的必胜策略肯定是把这堆石子全部拿完一颗也不给对手剩,然后对手就输了。如果剩下两堆不相等的石子,必胜策略是通过取多的一堆的石子将两堆石子变得相等,以后如果对手在某一堆里拿若干颗,你就可以在另一堆中拿同样多的颗数,直至胜利。如果你面对的是两堆相等的石子,那么此时你是没有任何必胜策略的,反而对手可以遵循上面的策略保证必胜。如果是三堆石子……好像已经很难分析了,看来我们必须要借助一些其它好用的(最好是程式化的)分析方法了,或者说,我们最好能够设计出一种在有必胜策略时就能找到必胜策略的算法。
定义和,其中代表,代表。直观的说,上一次移动石子的人有必胜策略的局面是P-position,也就是“后手可保证必胜”或者“先手必败”,现在轮到移动石子的人有必胜策略的局面是N-position,也就是“先手可保证必胜”。更严谨的定义是:
- 无法进行任何移动的局面(也就是)是P-position;
- 可以移动到的P-position局面是N-position;
- 所有移动都导致的N-position局面是P-position。
按照这个定义,如果局面不可能重现,或者说的集合可以进行拓扑排序,那么每个或者是或者是,而且可以通过定义计算出来。
以游戏为例来进行一下计算。比如说我刚才说当只有两堆石子且两堆石子数量相等时后手有必胜策略,也就是这是一个,下面我们依靠定义证明一下是一个。首先的子局面(也就是通过合法移动可以导致的局面)有(显然交换石子堆的位置不影响其性质,所以把和看成同一种局面),只需要计算出这三种局面的性质就可以了。的子局面有,其中显然是,所以是(只要找到一个是的子局面就能说明是)。的后继中是(因为的唯一子局面是),所以也是。同样可以证明是。所以的所有子局面都是,它就是。通过一点简单的数学归纳,可以严格的证明“有两堆石子时的局面是当且仅当这两堆石子的数目相等”。
根据上面这个过程,可以得到一个递归的算法——对于当前的局面,递归计算它的所有子局面的性质,如果存在某个子局面是,那么向这个子局面的移动就是必胜策略。当然,可能你已经敏锐地看出有大量的重叠子问题,所以可以用或者记忆化搜索的方法以提高效率。但问题是,利用这个算法,对于某个游戏的局面来说,要想判断它的性质以及找出必胜策略,需要计算个局面的性质,不管怎样记忆化都无法降低这个时间复杂度。所以我们需要更高效的判断游戏的局面的性质的方法。
必胜态必败态
对于一个游戏的局面,它是当且仅当^^…^,其中^表示异或(xor)运算。
相关题目
- hdu 1849 Rabbit and Grass
0 0
- nim 博弈
- Nim博弈
- Nim博弈
- NIM 博弈
- Nim 博弈
- Nim博弈
- nim 博弈
- Nim博弈
- Nim博弈
- Nim博弈
- nim博弈
- nim博弈
- (博弈Nim)Nim
- 博弈-Nim博弈
- Nim博弈变形(anti-nim)
- Nim(Nim博弈变形)
- Misere Nim (Nim博弈)
- POJ 2975 Nim <Nim 博弈>
- 请求和响应的装饰——装饰器设计模式
- Java程序员应该了解的第三方工具
- JAVA回顾巩固之String、StringBuilder、StringBuffer结合源码比较
- 基于人工神经网络的五子棋博弈(Details)
- 关于vs2012配色方案
- Nim博弈
- js作用域链
- LeetCode-203:Remove Linked List Elements
- Sticks
- C++ vector 用法(#include <vector>)
- Codeforces Round #364 (Div. 2)
- POJ 1861 Network
- 欢迎使用CSDN-markdown编辑器
- 求解一元二次方程