必胜局面和必败局面
如果一个局面
S
先手必胜,则称
几个定理
1.对于一个必胜局面
2.对于一个必败局面
S
,任何一种操作都使得其转化为必胜局面。
3.局面
- 若
S1
必败,
S2
必败,则
S
必败。
- 若
- 若
可以想象成两张桌子分别进行游戏。
与二进制的转化
S1=0,S2=0⇒S1∧S2=0 S1!=0,S2=0⇒S1∧S2!=0
S1==S2⇒S1∧S2==0
SG函数
若有一种函数 f(S) 使得满足当 f(S)=0 时 S 为必败局面,否则为必胜局面,且可以满足必胜必败定义,那么这个函数就是可以用子局面来异或的。即:
若
S=S1,S2,...,Sk,f(S)=f(S1)∧f(S2)...∧f(Sk)
那么:
假设现在甲乙正在博弈,甲在操作,把局面 S1 转化为 S′1 .
1. S 是必胜局面,此时f(S)!=0 ,那么存在 S′1 满足转化后 f(S)=0
2. S 是必败局面,此时f(S)==0 ,那么任意 S′1 满足转化后 f(S)!=0可能直接看定义有点难懂,举一个例子:
对于经典NIM游戏(可自行百度),一个堆的石子数量为 x ,那么这个堆的SG 值为 x ,f(S)=x1∧x2...∧xk .很容易证明这个与原问题等价:
1.此时 f(S)!=0 ,那么可以操作一次使得 f(S′)==0 。
证明:
设 p=f(S) 。那么存在 xi 使得 xi∧p<x 。因为 p 的最高位1一定对应某一堆的二进制位1,只用异或这个堆即可。
把这个堆xi 转化为 xi∧p ,那么 f(S′)=f(S)∧p=0 ,得证。2.此时 f(S)==0 。那么任意一次操作对应着某一位的0,1改变,那么 f(S′)!=0 。
所以直接对所有堆异或便可得知最后的胜负。
一个更难的例子:
甲乙两人面对若干排石子,每一步必须从某一排中取走两枚石子,这两枚石子必须是紧紧挨着的,如果谁无法按规则取子,谁就是输家。此时 f(S) 如何求解?其实根据定义可以推出:
首先以前的操作等于把一堆 S1 分为两堆 S2,S3 (空的堆也是),根据定义, f(S)=f(S1)∧f(G1) ( G1 表示除了 S1 以外的所有堆)。
这次操作之后, f(S1) 会变为 f(S2)∧f(S3) ,下面根据定义来推广:
1. f(S)=0 ,任意 f(S′)!=0 。
这一步只需要满足任意 f(S2)∧f(S3)!=f(S1) 即可。2. f(S)!=0 ,存在 f(S′)=0 。
同样设 p=f(S) ,那么 f(S1)∧p<f(S1) ,要满足 f(S1) 要能转化为任意比 f(S1) 小的数,只需要处理所有 f(S2)∧f(S3) (这些都是 f(S1) 能转化的数),要满足任意而且不相等,则取 mex 即可。这一步与上面的NIM游戏其实是等价的。实际上,大多数博弈局面都是通过取子局面的 mex 求解。
SJ定理
若上述游戏变为最后的人输,那么先手必胜的条件有:
1.SG=0,且所有子游戏的SG值为1。
2.SG=1,且子游戏的SG值不全为1.
在证明之前需要明确这个定理只适用于每个子游戏SG值为0时为终止状态的情况(比如NIM游戏)。证明:
1情况显然成立。对于2情况,分为以下两种可能:
1. 只有一个堆大于1,那么先手可以选择保留这个堆的1个或者把这个堆拿完,那么会转化为先手必败。
2. 有两个堆大于1,此时将SG变为0即可转化为先手必败态(不满足以上两种必胜态)。