什么是 SG 函数
接着上次的讲解,我们来了解一个更通用的模型。我们把每一个状态变成一个点(在 Nim 游戏里就代表 a a a 数组),如果可以从一种状态转移到另一种状态,就在它们之间连一条有向边(在 Nim 里就是从 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an 到 a 1 ′ , a 2 , . . . , a n ( a 1 ′ < a 1 ) a_1',a_2,...,a_n(a_1'<a_1) a1′,a2,...,an(a1′<a1))根据公平博弈游戏的性质(有限步),这张图应当是 DAG(有向无环图)。真的是吗?似乎不是,在一些游戏里,它可能是多个 DAG(当然,你把 Nim 游戏的每个 a i a_i ai 的变化看成独立的一张图也不是不可以,输的条件就是每个 DAG 都走到了最终局面 0 0 0)。不过为了方便,我们先考虑一个 DAG 的情况。
SG 函数的定义与计算
设有向边的集合是 E E E,那么 s g ( x ) = M E X ( s g ( x ′ ) ) ( { x , x ′ } ∈ E ) sg(x)=MEX(sg(x')) (\{x,x'\}\in E) sg(x)=MEX(sg(x′))({ x,x′}∈E),所以 s g sg sg 函数需要用拓扑序逆序进行计算。
MEX(X) 是指不包含在整数集合 X 中的最小非负整数,如果 X 是空集,MEX(X)=0。
举个简单的例子,下图中每个点旁边的数字式是 s g sg sg 函数值。
SG 函数与必胜条件 C
最终局面,即出度为 0 0 0 的点(图中标蓝)的 s g sg sg 函数值是 0 0