根据百度百科:Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。
Nim游戏是一种两个人玩的游戏,玩家面前是一堆石头,假设有 k ≥ 1 k\ge 1 k≥1堆石头,每堆分别有 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1,n2,⋯,nk块石头。这一游戏的目标就是取得最后一块石头,游戏规则如下:
我们的问题有两个:
这是一般情况下要遵守的重要原则,即先考虑小的或特殊的情况,然后再尝试着拓展这一思路去解决更一般的问题。
首先考虑 k = 1 k=1 k=1的情况。显然,先出手的玩家 A A A取走这一整堆就可以获胜。
其次考虑 k = 2 k=2 k=2的情况,此时分别有 n 1 , n 2 n_1,n_2 n1,n2块石头。这个时候玩家 A A A是否可以获胜不取决与具体的 n 1 , n 2 n_1,n_2 n1,n2值,而是取决于他们是否相等。假设 n 1 ≠ n 2 n_1 \neq n_2 n1=n2,那么玩家 A A A可以从较大堆中取走适量的石头,从而给玩家 B B B剩下两堆相等的石头堆,接下来无论 B B B取走多少块石头, A A A只要从另一堆取相同数量的石头就好了。这个策略就保证了玩家 A A A可以获胜。但是如果 n 1 = n 2 n_1 = n_2 n1=n2,那就变成了 B B B模仿 A A A的取子方式而获胜。因此 k = 2 k=2 k=2时的Nim游戏问题就被解决了。下面是 2 2 2堆石头的例子,其中 n 1 = 8 , n 2 = 5 n_1= 8,n_2=5 n1=8,n2=5:
8 , 5 → A 5 , 5 → B 5 , 2 → A 2 , 2 → B 0 , 2 → A 0 , 0 8,5 \stackrel{A}{\rightarrow} 5,5 \stackrel{B}{\rightarrow} 5,2 \stackrel{A}{\rightarrow} 2,2 \stackrel{B}{\rightarrow} 0,2 \stackrel{A}{\rightarrow} 0,0 8,5→A5,5→B5,2→A2,2→B0,2→A0,0
上述 2 2 2堆特殊情况的Nim游戏思路是:用某种方式取子使得剩余两堆的大小相同。这一想法可以推广到任意 k k k堆的情况。推广的关键是二进制整数的概念。我们可以将每一个正整数都转换为二进制,例如:
57 = 2 5 + 2 4 + 2 3 + 1 0 → 111001 57=2^5+2^4+2^3+1^0\rightarrow111001 57=25+24+23+10→111001
对于一堆石头,我们可以认为它是由 2 2 2的幂的子堆组成的。因此 57 57 57块的石头堆可以视为由 2 5 , 2 4 , 2 3 , 1 0 2^5,2^4,2^3,1^0 25,24,23,10大小的子堆组成。
对于 2 2 2堆Nim游戏,各种大小的子堆总数只能是 0 , 1 , 2 0,1,2 0,1,2。具有特定大小的子堆正好有一个当且仅当这两堆的大小不同,也就是说,各种大小的子堆总数是偶数当且仅当这两堆大小相同。
现在来考虑大小为 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1,n2,⋯,nk的一般的Nim游戏。我们把每一个数字 n i n_i ni表示成二进制:
n 1 = a s ⋯ a 1 a 0 n 2 = b s ⋯ b 1 b 0 ⋮ n k = e s ⋯ e 1 e 0 n_1 = a_s\cdots a_1a_0\\ n_2 = b_s\cdots b_1b_0\\ \vdots \\ n_k = e_s\cdots e_1e_0 n1=as⋯a1a0n2=bs⋯b1b0⋮nk=es⋯e1e0
我们可以通过在每个二进制数前面补 0 0 0来将所有二进制的位数变得一致。我们称一个游戏是平衡的,指的是各种大小的子堆数是偶数。因此一个Nim游戏是平衡的当且仅当:
a s + b s + ⋯ e s 为 偶 ⋮ a 1 + b 1 + ⋯ e 1 为 偶 ⋮ a 0 + b 0 + ⋯ e 0 为 偶 a_s+b_s+\cdots e_s 为偶\\ \vdots \\ a_1+b_1+\cdots e_1 为偶\\ \vdots \\ a_0+b_0+\cdots e_0 为偶 as+bs+⋯es为偶⋮a1+b1+⋯e1为偶⋮a0+b0+⋯e0为偶
若一个Nim游戏是不平衡的,则称它为非平衡的。我们说第 i i i位是平衡的,指的是和 a i + b i + ⋯ + e i a_i+b_i+\cdots + e_i ai+bi+⋯+ei是偶数,否则就是非平衡的。因此,如果一个游戏是平衡的,则它在各个位上都是平衡的,而对于非平衡游戏来说,至少存在一个非平衡位。
于是我们有一个结论:玩家 A A A能够在非平衡Nim游戏中获胜,而玩家 B B B能够在平衡Nim游戏中获胜。
假设这个Nim游戏是非平衡的。设最大不平衡位是第 j j j位。于是,玩家 A A A以某种方式取走硬币给玩家 B B B留下一个平衡游戏,他的做法是:选出一个第 j j j位上是 1 1 1的堆,并从中取走一定数目的硬币使得剩下的游戏是平衡的。无论玩家 B B B怎么取,他都会给 A A A留下一个不平衡游戏,玩家 A A A再上述做法将这个游戏变平衡。这样便保证了玩家 A A A获胜,反之如果游戏一开始就是平衡的,则 B B B获胜。
给定一个 k = 4 k=4 k=4的Nim游戏,其中堆的大小为 7 , 9 , 12 , 15 7,9,12,15 7,9,12,15 ,我们将其表示为二进制:
7 → 0111 9 → 1001 12 → 1100 15 → 1111 \begin{aligned} 7\rightarrow 0111\\ 9\rightarrow1001\\ 12\rightarrow1100\\ 15\rightarrow 1111 \end{aligned} 7→01119→100112→110015→1111
这个游戏的第 3 , 2 , 0 3,2,0 3,2,0位是不平衡的。这时玩家 A A A可以有 3 3 3中方式取走石头:
对于给定的 k k k堆石头,大小为 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1,n2,⋯,nk,根据上面对平衡和非平衡的讨论,我们可以直接将这些数字异或起来来判断谁赢:如果 n 1 ⊕ n 2 ⊕ ⋯ ⊕ n k ≠ 0 n_1\oplus n_2\oplus \cdots \oplus n_k \neq 0 n1⊕n2⊕⋯⊕nk=0则说明游戏非平衡, A A A赢,反之 B B B赢。