前置知识:Nim博弈(还没接触过的可以顺便学一学把模板题做了,本文求简洁,不再解释此知识)
参考文章:博弈论 SG函数(需要更详细的解释的可去此处)
正文:
提出问题:给定多个有向无环图,每个图有一个起始顶点,起始顶点上有一枚棋子,两名选手交替地选择一个图将其上的那枚棋子沿有向边进行移动,无法移动者判负。
接下来分析一个图的情况:
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:g(x)=mex{ g(y) | y是x的后继 }。
我们令各个结点x的值为g(x)。 例如:
可推得g(x)有如下性质:
(1)当g(x)=0,其后继结点都非0;
(2)当g(x)>0,其后继结点中都存在所有0~g(x)-1的点;
起始结点为0的情况,先手将使棋子走向一个非0结点,则后手必能使棋子继续走向一个为0的结点。先手者无可奈何,无法使棋子结点值改变。
(若先手必胜,先手不必在这里走;若后手必胜,先手也无法改变什么,局势尽在后手掌握之中。于是该情况可以不予理会了。)
起始结点为k(k>0)的情况,先手能使棋子走向0 ~ k-1值任意一个结点。
(如果存在值大于k的后继结点,先手走向该后继结点结点后,后手能继续走向该后继结点的一个值也为k的后继结点,所以先手者无法使棋子结点值变大,只能使其走向0 ~ k-1值的结点。若先手必胜,不会走大于k的点;若后手必胜,先手也无法改变什么,局势尽在后手掌控之中。于是该情况可以不予理会了。)
即可转化为Nim博弈问题,从k个石子的堆里取石子,使堆中石子数变为0~k-1。
`Conclusion(Nim博弈):
记每个堆的初始结点值为t(i),则
if t(1)^t(2)^...^t(x) = 0 : 先手必败;
else 先手必胜`;
此类似问题都可用SG函数解决,其实际上是个解决问题的工具。