SG函数入门

必胜局面和必败局面

如果一个局面 S 先手必胜,则称S为必胜局面,如果后手必胜,则称 S 为必败局面。

几个定理

1.对于一个必胜局面S,存在一种操作使得其转化为必败局面。
2.对于一个必败局面 S ,任何一种操作都使得其转化为必胜局面。
3.局面S可以分解为两个子局面 S1,S2 ,且:
- 若 S1 必败, S2 必败,则 S 必败。
- 若S1必胜, S2 必败,则 S 必败。
- 若S1=S2,则 S 必败。
可以想象成两张桌子分别进行游戏。

与二进制的转化

  • S1=0,S2=0S1S2=0

    • S1!=0,S2=0S1S2!=0

    • S1==S2S1S2==0

    • SG函数

      若有一种函数 f(S) 使得满足当 f(S)=0 S 为必败局面,否则为必胜局面,且可以满足必胜必败定义,那么这个函数就是可以用子局面来异或的。即:

      S=S1,S2,...,Sk,f(S)=f(S1)f(S2)...f(Sk)
      那么:
      假设现在甲乙正在博弈,甲在操作,把局面 S1 转化为 S1 .
      1. S 是必胜局面,此时f(S)!=0,那么存在 S1 满足转化后 f(S)=0
      2. S 是必败局面,此时f(S)==0,那么任意 S1 满足转化后 f(S)!=0

      可能直接看定义有点难懂,举一个例子:
      对于经典NIM游戏(可自行百度),一个堆的石子数量为 x ,那么这个堆的SG值为 x f(S)=x1x2...xk.很容易证明这个与原问题等价:
      1.此时 f(S)!=0 ,那么可以操作一次使得 f(S)==0
      证明:
      p=f(S) 。那么存在 xi 使得 xip<x 。因为 p 的最高位1一定对应某一堆的二进制位1,只用异或这个堆即可。
      把这个堆xi转化为 xip ,那么 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即可转化为先手必败态(不满足以上两种必胜态)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值