尼姆游戏

桌上有几堆石子,两人轮流从某一堆里取任意多颗(至少取 1 颗),取走最后一颗者胜。先手必败还是必胜?答案藏在各堆数量的“异或”里。

分类
组合游戏
难度
进阶
标签
博弈、异或、尼姆和
尼姆游戏 · 漫画配图
漫画 · 尼姆游戏

题目

尼姆(Nim)游戏:桌上有若干石子,比如三堆分别是 3、4、5 颗。两人轮流行动,每次从某一堆里取走至少 1 颗、至多整堆,取走最后一颗石子的人获胜。

面对任意初始局面,怎么判断先手必胜还是必败?又该怎么走?

答案与解析

关键在于把所有堆的数量做按位异或(XOR,记作 ⊕),得到“尼姆和”:

N=a1a2akN = a_1 \oplus a_2 \oplus \cdots \oplus a_k

  • N=0N = 0:这是必败局(P 局),轮到谁谁输(假设对手不犯错);
  • N0N \ne 0:这是必胜局(N 局),先手总能一步把它变成 N=0N=0 留给对方。

以上面的 3、4、5 为例,写成二进制:

3 = 011
4 = 100
5 = 101
--------
XOR= 010 = 2   (非零 → 先手必胜)

先手要找一堆,把它改成“与当前尼姆和 XOR 后更小的值”。比如选 5(101),目标值应为 52=75\oplus 2 = 7?不对,应使新值 xx 满足 x(其余堆的异或)=0x \oplus (\text{其余堆的异或}) = 0,即 x=其余堆的异或=34=7x = \text{其余堆的异或} = 3\oplus4 = 7?但 7>5 不能减。改选 4(100):42=6>44\oplus2=6>4 也不行。选 3(011):32=13\oplus2 = 1,把 3 那堆取到剩 1 颗(取走 2 颗),新局势 1、4、5 的异或 = 145=01\oplus4\oplus5 = 0,成功甩出必败局。

背后的数学

尼姆游戏是组合博弈论的基石,由查尔斯·博顿在 1901 年给出完整解。它的美妙在于把“胜负”完全编码进一个整数运算。

更进一步,Sprague–Grundy 定理表明:一大类“公平双人无随机、无平局”的博弈,都能被拆解成若干独立的尼姆堆,每堆对应一个“Grundy 数”(尼姆值)。尼姆和是这类博弈的通用判据——这也是为什么计算机能秒算无数棋类残局的胜负。