有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负。
P-Position:Previous-player 刚刚走过的选手得胜的局势;
N-Position: Next-player将要走的选手得胜的局势;
终结状态:没有合法的操作集。由Nim的定义,终结状态就是P态。
1.任何终结局面都是P态。
2.若一个状态的所有后继状态都是N态, 那么该状态为P态
3.若一个状态为N态,那么它的后继状态中必有一个状态为P态。
理解:
P态表示先手必败,因为无论先手怎么走(产生的所有子局面都是N态),后手面临的都应该是N态,即:不管任何情况,对手都能赢,先手别无选择。
N态表示先手必胜,因为存在一种走法(子局面中有一个局面是P态),使得后手面临的是P态(刚刚走过的选手——即自己得胜),则先手肯定会选择这个走法。
若每堆的石子数分别为,则Nim和为.即各石子数的异或和。
Bouton定理:当且仅当时,该局面为P态。
证明:
(1)所有终结局面都是P态,因为唯一的终结局面是:每堆石子数都为0,异或和为0;
(2)对每一个N态局面,总有一个走法能使得子局面为P态。下面是构造方法:将Nim和写成列加和的形式,找到从左(最高位)开始找有奇数个1的那一列,从该位为1的数中任意挑一个,将其进行改变,使得改变后这些数的异或和为0,即:每列都是偶数个1。这一改变一定是使该数变小,因为最高位的1变成了0。设第i位是拥有奇数个1的最高位,选中的数为x,考虑除去x外的其他数,计算它们的异或和,将x改变成这个结果,则所有数异或的结果就为0了。由于除x外的数异或的结果一定不超过 ,因此一定可以通过改变x来使得异或和为0(x的第i位原本为1,足够减小这么多)。如图所示:
(3)对每一个P态局面,所有的走法都会导致子局面为N态。假设被改变为,由于,所以,否则有:。故此条属性也满足。
综上:定理得证。
有N堆石子放在N级楼梯上,楼梯编号为1..N(地面为0层),每堆有a[n]个石子。两人轮流游戏,每次将任意堆j中的任意个石子但至少一个移动到它的相邻层j - 1。直到所有石子都移动到0号,最后移动的为胜者。
解决方法:把所有奇数阶梯看成N堆石子做nim,把石子从奇数堆移动到偶数堆可以理解为拿走石子..就相当于几个奇数堆的石子在做Nim。
只要对手移动偶数堆的石子到奇数堆,那么下一步我们总有操作可以进行(将奇数堆的石子移动到前面的偶数堆),游戏尚未结束。
假设初始时奇数堆的局面是N态...先手就能按照必胜策略将奇数堆的石子移动到偶数堆(相当于拿石子),使其变为P态(异或和为0)。如果对手也是移动奇数堆,我们继续移动奇数堆保持P态。如果对手将偶数堆的石子移动到了奇数堆,那么我们紧接着将对手所移动的这么多石子从那个奇数堆移动到下面的偶数堆,相当于偶数堆的石子向下移动了几个,而奇数堆依然是原来的样子,即为先手必胜的状态。就算后手一直在移动偶数堆的石子到奇数堆,我们也能一直跟着他将石子继续往下移,保持奇数堆不变。如此做下去,先手可以跟着后手把偶数堆的石子移动到0层,而后手却不能再动这些石子了。 所以整个过程..将偶数堆移动到奇数堆不会影响奇数堆做Nim博弈的过程..整个过程可以抽象为奇数堆的Nim博弈...
给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿着有向边进行移动,无法移动者判负。
任何一个部分组合游戏ICG都可以通过把每个局面看成一个顶点,对每个局面和它的子局面连一条有向边来抽象成这个“有向图”游戏。在有向无环图的顶点上定义Sprague-Grundy函数。
首先定义 mex(minimal excludant) 运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如 mex{0,1,2,4}=3 、 mex{2,3,5}=0 、 mex{}=0 。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数如下:g(x) = mex{ g(y) | y = F(x)},F(x)表示x的子局面。
来看一下 SG 函数的性质。首先,所有的 terminal position 所对应的顶点,也就是没有出边的顶点,其 SG 值为 0 ,因为它的后继集合是空集。然后对于一个 g(x)=0 的顶点 x ,它的所有后继 y 都满足 g(y)!=0 。对于一个 g(x)!=0 的顶点,必定存在一个后继 y 满足 g(y)=0 。
所以g(x) = 0的局面对应一个P态,g(x) != 0的局面的对应一个N态。
对于 n 个棋子,设它们对应的顶点的 SG 值分别为 (a1,a2,...,an) ,再设局面 (a1,a2,...,an) 时的 Nim 游戏的一种必胜策略是把 ai 变成 k ,那么原游戏的一种必胜策略就是把第 i 枚棋子移动到一个 SG 值为 k 的顶点
定义有向图游戏的和 (Sum of Graph Games) :设 G1 、 G2 、 …… 、 Gn 是 n 个有向图游戏,定义游戏 G 是 G1 、 G2 、 …… 、 Gn 的和 (Sum),游戏 G 的移动规则是:任选一个子游戏 Gi 并移动上面的棋子。 Sprague-Grundy Theorem 就是: g(G)=g(G1)^g(G2)^...^g(Gn) 。也就是说,游戏的和的 SG 函数值是它的所有子游戏的 SG 函数值的异或。
面对由 n 个游戏组合成的一个游戏时,只需对于每个游戏找出求它的每个局面的 SG 值的方法,就可以把这些 SG 值全部看成 Nim 的石子堆,然后依照找 Nim 的必胜策略的方法来找这个游戏的必胜策略了!
取完最后的石子的为败者。
策略:当至少有两堆的石子数大于1时,拿法跟常规的Nim一样。当对手走完某一步后只剩一堆石子数大于1时,将那一堆石子变成0或者1,从而保证有奇数个石子数为1的堆。原因是:在nim游戏中最优策略永远不会让你留下一个石子数大于1的堆(否则Nim和一定不为0),而且有两堆石子数大于1的时候,对手也无法使这两堆同时消失。所以游戏最终变成只有一堆石子大于1的时候一定是轮到你了。
结论:先手必胜当且仅当:
(1)每一堆都只剩一个石子,且SG为0.(即:有偶数堆的石子数目为1)
(2)至少有一堆石子数目>1,且SG和不为0.(先手总可以将数目>1的石子堆数变为奇数堆)
证明:
(1)情况一:有 N 个堆,每个堆只有一个石子。显然,先手必胜当且仅当 N 为偶数,即SG和为0。
(2)情况二:
①当 SG 不为 0 时:若还有至少两堆石子的数目大于 1,则先手将 SG 值变为 0 即可;若只有一堆石子数大于 1,则先手总可以将状态变为只有奇数个 1。所以,当 SG 不为 0 时先手必胜。
②当 SG 为 0 时:至少有两堆石子的数目大于 1,则先手决策完之后,必定至少有一堆的石子数大于 1,且 SG 值不为 0(原先为0,改变一个数后一定不为0了),由上段的论证我们可以发现, 此时,无论先手如何决策,都只会将游戏带入N态(即情况1),所以先手必败。