部分学习自这个up
SG函数的计算方法
一个局面的SG为mex{后继局面的SG}
几个局面的和的SG为单个的SG异或
SG不为0时先手必胜,SG为0时后手必胜
证明的基本套路
必胜局面存在一个操作到达必败局面,必败局面无论怎么操作都会到必胜局面
1、Nim Game
比较经典的问题:有n堆石子,每次可以从任意一堆里选出任意数量(不为0)的石子,不能取的输
对于一堆石子,SG函数就是石子数
整个游戏的SG函数是每堆石子SG函数的异或和
必胜:SG不为0
必败:SG为0
2、Bash Game
每次最多取m个石子,其他同Nim
一堆石子的SG函数为石子数mod(m+1)
整个游戏的SG函数是每一堆石子的SG函数的异或和
必胜:SG不为0
必败:SG为0
3、Nimk Game
每次最多可以对k堆石子进行操作,这k堆可以取不同数量的石子
一堆石子的SG函数为石子数
对每一个二进制位单独算,求SG函数每一个二进制位1的个数mod(k+1),如果都为0,则必败,否则必胜
4、Anti-Nim Game
不能取石子的一方获胜
必胜:SG不为0且至少有一堆石子数大于0,SG为0且每一堆石子数都为1
必败:其余为必败
5、Staircase Nim
阶梯博弈
每次可以从一个阶梯上拿掉任意数量石子放到下一层阶梯,不能操作的为输
SG函数为奇数阶梯上的石子的异或和
如果移动偶数层的石子到奇数层,对手一定可以继续移动这些石子到偶数层,使得其SG不变
6、Wythoff Game
有两堆石子,每次可以从一堆或者两堆里拿走一样数目的石子,不能取的为输
必败态为(1,2)(3,5)(4,7)(6,10)…
差为1,2,3,4…..每一对数的第一个数为前面没出现的最小的正整数
7、Multi-SG
每次操作完了以后一个单一游戏可能分裂成两个单一游戏
暴力计算SG值然后把后继的求异或和计入
8、树上删边游戏
给定根节点,每次可以删掉一条边,不与根节点相连的部分删除
叶子节点SG为0,其他节点的SG函数为子树SG+1的异或和
9、无向图删边
规则同树上删边游戏
结论:把奇环缩成一个点加一条新边,把偶环缩成一个点,不影响SG,然后套用树上删边游戏
10、翻硬币游戏
n枚硬币排成一排,有的正面朝上,有的反面朝上。
游戏者根据某些约束翻硬币(如:每次只能翻一或两枚,或者每次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是从正面翻到反面。 谁不能翻谁输。
需要先开动脑筋把游戏转化为其他的取石子游戏之类的,然后用如下定理解决:
局面的 SG 值等于局面中每个正面朝上的棋子单一存在时的 SG 值的异或和。
11、Every-SG
由很多单一游戏组成,每次每个玩家需要在每一个能够操作的单一游戏上进行操作,最后结束的那个单一游戏的胜负决定整个游戏的胜负。
那么就在求解SG函数的过程中引入记录最优步数的step,如果当前状态是必胜态,那么当前状态的step就是所有是必败态的后继的step的最大值;如果当前状态是必败态,step就是所有后继状态step的最小值。这个也比较好理解,因为每个人都会采取对自己最有利的策略。最后如果步数最大的那个单一游戏会在奇数步结束那么先手就是必胜的。