SG函数 博弈笔记

基础知识

公平组合游戏

公平组合游戏指的是:

  • 一个人可以做出的决策与这个人是 Alice 还是 Bob 无关,只和当前游戏状态有关。

  • 大家都知道游戏的完整信息,知道现在的状态,云云。

  • 不能多次到达同一个状态。

  • 无论怎么操作,游戏必须在有限步操作后结束,且必须有胜负,不能平局。(当然好像有些题目违反了这一条,却还是可做,让我上蹿下跳)

注意,象棋不是公平组合游戏,因为玩家不能用对方的棋子,而且也可以通过来回走棋子使得游戏永不结束。

SG 函数

对于一个 SG 图:

  • 没有出边的点,是必败点。

  • 所有出边都是必胜点的点,是必败点。

  • 有至少一个出边是必败点的点,是必胜点。

证明显然,故不证明。

对于一个点 SG(x)=mex( SG(v) )

所以初始状态是,没有出边的点 SG(x)=0

对于 n 个游戏,两个(如贝极星般)顶级聪明玩家博弈,每次可以选择一个游戏操作一次,最后所有游戏都不可以操作的玩家失败。

n 个游戏的起点分别为 s1,s2,...,sn

先手必胜当且仅当:

T=s1\ xor\ s2\ xor\ ...\ xor\ sn0

所以等于 0 就先手必败了。

同时, T 也被称作整局游戏的 SG 值。和一个点不同的是,它是由若干个棋子(几个独立的游戏),而一个点只有一个棋子。

最后落得满盘皆输,却不晓得,从最初之始,就已是命中注定!

例题

不要问为什么题目顺序如此奇怪

P3185 - 分裂游戏

https://www.luogu.com.cn/problem/P3185

发现,如果一个瓶子有大于等于两颗豆子,那么后手可以模仿先手操作。

所以只关心一个瓶子豆子模 2 的数量。

计算 SG:

SG(n)=0,因为 n 上的豆子不能移动。

SG(i)=mex( SG(j) xor SG(k) ),i<jk,因为将 i 移动到 j,k 后,就相当于两个独立的游戏 ,独立游戏的 SG 值就是它们的异或,然后再取 mex。

所以,最后答案就是,如果瓶子 i 的豆子模 2 等于 1,那么就 SG(ans)=SG(ans) xor SG(i)。因为是独立游戏。

Nim 游戏

每堆石头是独立的,所以答案是它们 SG 值的异或和。

0 个石头:SG(0)=0

1 个石头:连向 0 石头状态,所以 SG(1)=mex( SG(0) )=1

2 个石头:连向 0 石头和 1 石头状态,所以 SG(2)=mex( SG(0),SG(1) )=2

……

n 个石头:连向 0,1,2,...,n1 石头状态,所以 SG(n)=n

所以如果 xor( SG(ai) )0 则先手胜,否则先手败。

AGC017D - Game on Tree

https://www.luogu.com.cn/problem/AT2667

对于一个以 x 为根的树,如果 x 只有一个儿子(不是只有一个子孙),那么先手斩断这条边就可以赢。

如果有两个儿子,那么谁先断掉某一条边,谁就输,所以就转化到在两子树上分别博弈。

但是,不论在子树中如何切割,我都可以直接将根到儿子的边直接切断,结束在子树中的博弈,所以子树中所有的博弈状态都会直接连到砍掉子树的状态。

所以就是 Nim 游戏了。对于一个点 u 且它的儿子是 v1,v2...,那么 u 对应的 SG 值(此时状态就是只保留 u 所在的子树,的博弈状态),SG(u)=xor( SG(v)+1 )。(因为 0 SG(u)1 的所有值都被占用了,感性理解一下)。

posted @   BlankAo  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示