Loading

【学习笔记】SG 函数与 SG 定理

Page Views Count

公平组合游戏

公平组合游戏满足以下条件:

  • 两个玩家参与游戏,轮流操作。

  • 游戏以某个玩家不能操作未结束,且不能操作的玩家失败,游戏不含平局。

  • 游戏的操作与玩家无关,只与当前的状态有关。

  • 游戏状态不会重复出现,若将状态设为点,将一次操作对状态的改变设为有向边,将得到有向无环图。

博弈图

根据公平组合游戏的最后一个条件,定义没有出边的状态必败状态,有连向必败状态出边的状态为必胜状态,没有连向必败状态出边的状态为必败状态。

可以通过搜索在 \(O(n+m)\) 的复杂度判断每个状态是否必胜或必败。

Nim 游戏

\(n\) 堆石子,第 \(i\) 堆有 \(a_i\) 个,轮流操作,每次操作可以任选一堆石子拿走若干,不能不拿,最终不能操作玩家的失败。

结论:当且仅当 \(\bigoplus_{i=1}^n a_i=0\) 时先手必败,否则先手必胜。

根据上面对状态必胜必败的定义,可以证明:

  • 最终不能操作时 \(a_i=0\),有 \(\bigoplus_{i=1}^n a_i=0\),必败。

  • \(\bigoplus_{i=1}^n a_i=k\neq 0\),设 \(k\) 的二进制最高位 \(2^d\),那么一定存在一个 \(a_i\) 满足 \(a_i\)\(2^d\) 上为 \(1\),此时一定有 \(a_i>a_i\oplus k\),令 \(a_i\leftarrow a_i\oplus k\),就可以到达一个异或和为 \(0\) 的必败状态,必胜。

  • \(\bigoplus_{i=1}^n a_i=0\),不难发现修改任意一个 \(a_i\) 一定会改变异或和,因此该状态只能到达异或和不为 \(0\) 的状态,必败。

SG 函数

定义一个状态 \(x\) 的 SG 函数 \(\mathrm{SG}(x)\),计算方式为:

\[\mathrm{SG}(x)=\mathrm{mex}(\mathrm{SG}(y_i)) \]

其中 \(y_i\)\(x\) 连向的状态,\(\mathrm{mex}\) 定义为集合中未出现的最小自然数。

\(\mathrm{SG}(x)=0\),则 \(x\) 状态是必败状态,否则是必胜状态。

证明依旧类似:

  • 终止状态的 \(\mathrm{SG}(x)=0\),必败。

  • \(\mathrm{SG}(x)\neq 0\),说明存在 \(\mathrm{SG}(y_i)=0\),即可以到达一个必败状态,必胜。

  • \(\mathrm{SG}(x)=0\),说明不存在 \(\mathrm{SG}(y_i)=0\),即无法到达一个必败状态,必败。

我们发现 \(\mathrm{mex}\) 函数的引入并不突兀,它只是十分契合判断必败必胜的方法。

SG 定理

定义一个局面 \(x\) 由若干互不影响的子游戏状态 \(x_i\) 组成,那么 \(\mathrm{SG}(x)=\bigoplus_{i=1}^n \mathrm{SG}(x_i)\)

证明仍然类似:

  • 终止状态所有 \(\mathrm{SG}(x_i)\) 均为 \(0\),必败。

  • 其他情况我们只关心操作对 \(\mathrm{SG}(x_i)\) 的改变,由 \(\mathrm{mex}\) 定义知 \(x_i\) 可以移动到的状态 \(y\) 中,\(\mathrm{SG}(y)\) 取遍 \([0,\mathrm{SG}(x_i)-1]\)。也可能存在 \(\mathrm{SG}(y)>\mathrm{SG}(x_i)\),但由于 \(y\) 可以移动到的状态 \(z\) 中,一定存在 \(\mathrm{SG}(z)=\mathrm{SG}(x_i)\),相当于没有操作,因此只会向更小的部分移动。这就等价于 Nim 游戏取石子了,直接套用 Nim 游戏的证明。

参考资料

  • OI Wiki
posted @ 2023-08-05 10:36  SoyTony  阅读(61)  评论(0编辑  收藏  举报