博弈游戏的各种经典模型(备忘)

SG函数的计算方法:

一个局面的SG为mex{后继局面的SG}

mex运算为集合中没出现的最小的自然数

几个局面的和的SG为单个的SG亦或

SG不为0时先手必胜,SG为0时后手必胜

 

1.Nim Game

最为经典

n堆石子,每次可以从一堆里面取任意个石子

对于一堆石子,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,则必败,否则必胜

证明:

对于必败态不管怎么走都只能走到必胜态

对于变化的SG的最高位,你至少变化为1,最多变化为k,所以这一位1的个数不可能mod(k+1)还是为0

对于必胜态我们肯定可以找到一种方法走到必败态

我们从高位往低位做,记s为这一位可以随意填值的数字个数(如果把某一位从1变成0,那么更低位就能随便取值了)

假设我们现在做到第k位,记n为除了能随便取值的s位以外这一位1的个数mod(k+1)

如果n+s<=k,那么很简单,我们取出n个第k位为1的让这些数字的第k位变成0,那s个数字这一位也变成0,然后s+=n

如果n+s>k,即n+s>=k+1,那么s>=k+1-n,我们在s中间取k+1-n个变为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.Take & Break

每次可以把一堆石子分成两堆甚至多堆不为0的石子,不能操作的为输

暴力计算SG

 

8.树上删边游戏

给定根节点,每次可以删掉一条边,不与根节点相连的部分删除

叶子节点SG为0,其他节点的SG函数为子树SG+1的亦或和

证明:

将子树SG+1看做石子数(我们可以定义没有节点的图的SG为-1),然后就变成了取石子游戏

 

9.无向图删边

规则同树上删边游戏

结论:把奇环缩成一个点加一条新边,把偶环缩成一个点,不影响SG,然后套用树上删边游戏

 

10.翻硬币游戏

n枚硬币排成一排,有的正面朝上,有的反面朝上。
游戏者根据某些约束翻硬币(如:每次只能翻一或两枚,或者每次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是从正面翻到反面。
谁不能翻谁输。

需要先开动脑筋把游戏转化为其他的取石子游戏之类的,然后用如下定理解决:
局面的 SG 值等于局面中每个正面朝上的棋子单一存在时的 SG 值的异或和。

 

证明的基本套路:

必胜局面存在一个操作到达必败局面,必败局面无论怎么操作都会到必胜局面

posted @ 2016-08-24 22:04 Randolph87 阅读(...) 评论(...) 编辑 收藏