🔖 组合数学组合游戏SG 定理

NP 状态描述

  • 无法进行任何移动的局面为 P-position
  • 可以移动到 P-position 的局面为 N-position
  • 任意移动都到达 N-position 的局面为 P-position

Nim 游戏

Nim 游戏是组合游戏中的经典游戏,描述如下:有 n 堆石子,第 i 堆有 xi 颗石子。AB 两人轮流取石子,每次仅能选择一堆不为空的石子进行操作:取走至少一颗石子。不能操作的人输。

关于 Nim 游戏有一个著名的结论:当且仅当 x1x2xn=0 时,先手获胜;否则后手胜。证明很简单,当 X=x1x2xn0 时,设 X 的二进制最高位为 k,那么一定存在一个 xi 其第 k 位为 1。我们只需要从第 i 堆石子中取走 Xxi[1],那么新的游戏状态为:

X=x1x2(xiX)xn=XX=0

事实上,这也是构造 Nim 游戏方案的方法。接下来,介绍 SG 函数和 SG 定理,SG 函数和 SG 定理是解决一类组合游戏的有力工具。

SG 函数

对于任意状态 x,定义 SG(x)=mex(S);其中,Sx 的所有后继状态的 SG 函数值集合,mex(S) 表示不在 S 中的最小非负整数。 特别地,当 S 为空集,即 x 没有后继节点时,SG(x)=0。不难验证:

xis{P-position,SG(x)=0N-position,SG(x)0

SG 定理

游戏和的 SG 函数等于各子游戏的 SG 函数的 Nim 和。 具体来说,若游戏 A 可以看做由 n 个互不干扰的子游戏 (A1,A2,,An) 构成;也就是对于游戏任一状态 (x1,x2,,xn),只能选择一个子游戏 Ai(1in) 进行操作,得到状态 (x1,x2,,xi,,xn);那么有:

SGA(x1,x2,,xn)=SGA1(x1)SGA2(x2)SGAn(xn)

不妨假设当前游戏状态为 X=(x1,x2,,xn);记 X 的所有后继状态集合为 S;并记 b=SGA1(x1)SGA2(x2)SGAn(xn)。我们的证明分两步:

  1. 0a<b,XSSGA(X)=a.

  2. XSSGA(X)b.


step 1

c=ba;因为 a<b,所以必有:若 c 的二进制最高位为 k,则 b 的二进制第 k 位也为 1;否则必有 a>b。于是必有 xiX 满足 SGAi(xi) 的二进制第 k 位为 1。令 d=cSGAi(xi),不难验证:d<SGAi(xi)。所以,根据 SG 函数的定义可知,子游戏 Ai 必有一个 SG 值为 d 的后继节点 xi。此时,

(1)SGA1(x1)SGA2(x2)SGAi(xi)SGAn(xn)(2)=SGA1(x1)SGA2(x2)(SGAi(xi)=d=cSGAi(xi)=baSGAi(xi))SGAn(xn)(3)=(SGA1(x1)SGA2(x2)SGAi(xi)SGAn(xn))ba(4)=bba(5)=a

step 2

不妨操作子游戏 Ai 到状态 xi 得到游戏状态 X=(x1,x2,,xi,,xn)。由 SG 函数的定义可知, SGAi(xi)SGAi(xi),即 SGAi(xi)SGAi(xi)0。那么:

(6)SGA1(x1)SGA2(x2)SGAi(xi)SGAn(xn)(7)=SGA1(x1)SGA2(x2)((SGAi(xi)SGAi(xi))SGAi(xi))SGAn(xn)(8)=bSGAi(xi)SGAi(xi)(9)b

小结

SG 函数的定义,不难联系到 Nim 游戏。实际上,我们可以用解决 Nim 游戏的方法来构造一般组合游戏的方案。只需要顺着将 SG(X) 变成 0 的方向做出决策就好了。在实际问题上,通常 x 是一个很大的数,但是一般 SG 函数是有规律的(总要给点活路= =),然后只要本地打表找规律。。。

练习

#problemscategoriessolution/code
151node / 1661SG 函数(本地打表找规律)solution.cpp
  •  [1]: 

    因为此次异或运算消除了最高位,所以显然有 Xxi<xi,即此操作总是可以达成的

© 2017-2026 光和尘有花满渚、有酒盈瓯

Comments