公平组合游戏学习笔记

公平组合游戏:双方操作形式相同,先手操作一次后相当于交换先后手。

Part 1 Nim 游戏

nn 个非负整数 {ai}\{a_i\},双方轮流选择一个 1idn1\le id\le n 并将 aida_{id} 减少任意正整数,不能操作者输。

先抛结论,先手必胜当且仅当 ai=0\oplus a_i\not=0

证明考虑归纳,显然 ai=0\forall a_i=0 的状态满足该结论。假设对于某个状态 {ai}\{a_i\},已经证明其能到达的所有状态(满足 biaib_i\le a_i 且和 {ai}\{a_i\} 不相同的状态 {bi}\{b_i\})满足该结论,那么设当前异或和为 xx

  • x=0x=0 那么无论怎么操作都会到达异或和不为 00 的状态,即当前状态先手必败;
  • 否则设 2y2^yxx 的二进制最高位,那么一定存在某个 jj 满足 aja_j 该位也为 11,那么有 ajx<aja_j\oplus x<a_j,所以先手可以通过将 aja_j 修改为 ajxa_j\oplus x 来到达异或和为 00 的状态,即当前状态先手必胜;

{ai}\{a_i\} 也满足该结论,证毕。

Part 2 DAG 走路游戏和 SG 定理

有一个有向无环图,初始某个点上有一个棋子,双方轮流沿着有向边推动棋子,无法操作者输。

几乎所有公平组合游戏都能转换为该游戏。

对于节点 xx,设 SG(x)=mex{SGv}SG(x)=\text{mex}\{SG_v\},其中 vvxx 的所有后继节点,mex(S)\text{mex}(S) 表示最小的不在集合 SS 中的非负整数。

特别的,若 xx 没有后继节点,则 SG(x)=0SG(x)=0

SG 引理断言:

多个棋子情况下,棋子集合为 {si}\{s_i\} 的 DAG 走路游戏先手必胜当且仅当 SG(si)=0\oplus SG(s_i)\not=0

证明考虑归纳,边界情况显然满足。

对于 xx 的所有后继 vv,显然 SG(v)=SG(x)SG(v)\not=SG(x),且走到 SG(v)>SG(x)SG(v)>SG(x)vv 是没有意义的,因为可以走回某一个 SG(y)=SG(x)SG(y)=SG(x)yy

由于 s<SG(x)\forall s<SG(x) 都存在一个 vv 满足 SG(v)=sSG(v)=s,所以这就是一个 Nim 游戏,根据 Nim 游戏的结论即可证明 SG 引理。

同理,有推论:

SG 定理:多个棋子情况下,棋子集合为 {si}\{s_i\} 的 DAG 走路游戏满足 SG({si})=SG(si)SG(\{s_i\})=\oplus SG(s_i)

证明依旧是归纳,边界情况显然成立。

对于一个状态 {si}\{s_i\},显然 SG(si)\oplus SG(s_i) 是无法达到的,而对于 x<SG(si)x<\oplus SG(s_i)xx,证明类比 Nim 游戏结论的证明,这些 xx 一定都能达到,故 SG({si})=SG(si)SG(\{s_i\})=\oplus SG(s_i)

Part 3 一些特殊的游戏

3.1 二分图游戏

有一个二分图,初始有一个棋子在 ss,每次可以将棋子移到相邻的点,不能移动到重复的点,无法操作的人输。

结论

定理 3.1:一个点 uu 先手必胜当且仅当其在所有最大匹配中。

证明

首先若 uu 不和任何点相连时显然满足定理 3.1。

先手必败情况证明:

考虑若存在某个最大匹配 MM,满足 uu 不在 MM 中,那么与 uu 有边相连的点 vv,一定都在匹配 MM 中(否则 (u,v)(u,v) 可以加入匹配 MM),那么后手只要每次移动到 MM 中对应匹配点上即可。

先手必胜情况证明:

uu 在所有最大匹配中,那么先手可以随便选择一个最大匹配 MM,从 uu 走到其匹配点 vv,并把匹配 (u,v)(u,v) 删掉。

由于 uu 在所有最大匹配中,所以此时 MM 一定还是最大匹配,而 vv 不在匹配 MM 中,故是先手必败情况。

判断一个点是否在所有最大匹配中是简单的,只要删掉这个点跑一次最大匹配和删点前的最大匹配比较即可。

如果要判断每个点是否在所有最大匹配,那么可以跑网络流,再判断能否退流。具体的,对于匹配 (u,v)(u,v),判断是否存在 SSvv 的路径即可,若有则 uu 不在所有最大匹配中。

3.2 翻转黑白棋游戏

局面上有一些黑白棋,棋子总数不变,每次操作形如:

  • xx 为白色则可以翻转满足 sSxs\in S_x 的集合 ss 中棋子的颜色(SxS_x 为集合组成的集合);

操作保证不能无限进行,终止局面为全黑。

结论

定理 3.2:用白棋位置的集合来表示一个局面,则 SG({a1,a2,,ak})=i=1kSG({ai})SG(\{a_1,a_2,\dots,a_k\})=\oplus_{i=1}^k SG(\{a_i\}),即可以看作是若干个只有一个白棋的独立游戏。

证明

首先只有一个白棋的情况显然满足。

而对于一个局面 {ai}\{a_i\},显然其能进行的操作为 Sai\cup S_{a_i},故拆成独立游戏后并不影响可行的操作集合。而取反了集合 {si}\{s_i\} 的操作相当于让总的 SG 值异或上 SG(si)\oplus SG(s_i),由于颜色翻转相当于异或 11,而两个 SG(si)SG(s_i) 会抵消,故当前局面满足结论。