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

Page Views Count

公平组合游戏#

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

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

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

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

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

博弈图#

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

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

Nim 游戏#

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

结论:当且仅当 i=1nai=0 时先手必败,否则先手必胜。

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

  • 最终不能操作时 ai=0,有 i=1nai=0,必败。

  • i=1nai=k0,设 k 的二进制最高位 2d,那么一定存在一个 ai 满足 ai2d 上为 1,此时一定有 ai>aik,令 aiaik,就可以到达一个异或和为 0 的必败状态,必胜。

  • i=1nai=0,不难发现修改任意一个 ai 一定会改变异或和,因此该状态只能到达异或和不为 0 的状态,必败。

SG 函数#

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

SG(x)=mex(SG(yi))

其中 yix 连向的状态,mex 定义为集合中未出现的最小自然数。

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

证明依旧类似:

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

  • SG(x)0,说明存在 SG(yi)=0,即可以到达一个必败状态,必胜。

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

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

SG 定理#

定义一个局面 x 由若干互不影响的子游戏状态 xi 组成,那么 SG(x)=i=1nSG(xi)

证明仍然类似:

  • 终止状态所有 SG(xi) 均为 0,必败。

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

参考资料#

  • OI Wiki

作者:SoyTony

出处:https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Sprague-Grundy_Function_and_Sprague-Grundy_Theorem.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   SoyTony  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示