SG函数详解

来源:互联网 发布:sql注入例题分析 编辑:程序博客网 时间:2024/06/08 01:38

许多部分资料摘自百度百科

定义

给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。

定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{1,3,5}=0、mex{}=0。

对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy(SG)函数g如下:g(x)=mex{ g(y) | y是x的后继 }。

性质

①:没有出边的点(就是走不了的点)SG值为0。

②:对于一个g(x)=0的顶点x,它的所有前驱y都满足 g(y)!=0。

③:对于一个g(x)!=0的顶点,必定存在一个后继y满足g(y)=0。

(都挺显然的吧。。。)

先决条件

建议在看SG函数之前先学会Nim游戏,或者可以看看博主的Blog。

本质

SG函数本质就是Nim游戏。

让我们把一颗棋子推广到n颗棋子。

当g(x)=k时,表明对于任意一个0<=i<k,都存在x的一个后继y满足g(y)=i。也 就是说,当某枚棋子的SG值是k时,我们可以把它变成0、1、……、k-1,但绝对不能保持k不变。这与Nim游戏中取石子的情况非常相似:对于一堆石子,我们可以把它取成0~k-1个,但绝不可能不取。

那么我们是否可以这么考虑:将n枚棋子所在的顶点的SG值看作n堆相应数量的石子,那么这个Nim游戏的每个必胜策略都对应于原来这n枚棋子的必胜策略。对于n个棋子,设它们对应的顶点的SG值分别为(a1,a2,…,an),再设局面(a1,a2,…,an)时的Nim游戏的一种必胜策略是把ai 变成k,那么原游戏的一种必胜策略就是把第i枚棋子移动到一个SG值为k的顶点。

证明和Nim很相似。

问题求解

既然SG函数和Nim是一样的,那么不难推出判断必胜策略的条件:

当游戏的SG异或和=0时先手必败,否则先手必胜。

然后就和Nim一样做啦!

原创粉丝点击