SG函数学习博客:http://blog.csdn.net/strangedbly/article/details/51137432
我觉得认真看一看这篇博客的前半部分,遇到普通的博弈题不用那么惧怕了。
看SG函数不得不和尼姆博弈结合起来,然后又发现,尼姆博弈只不过是博弈论SG函数解决的一个特例。
具体SG函数的分析见上文博客....
自己的一些体会:
对于n堆石子的取石子游戏,每一堆的个数x都对应一个函数值sg(x),当所有堆的异或值为0时,先手必败。
定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
sg【x】=mex{ x1,x2,x3} (xi是x的后继状态的sg[]函数值!)
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:g(x)=mex{ g(y) | y是x的后继 }。
来看一下SG函数的性质。首先,所有的terminal position所对应的顶点,也就是没有出边的顶点,其SG值为0,因为它的后继集合是空集。
是不是跟尼姆博弈扯上关系了?异或运算的奇妙。
尼姆博弈解释及异或运算的解释:
推荐讲解:https://www.cnblogs.com/jiangjun/archive/2012/11/01/2749937.html
做题技巧:一般题目直接从小的数开始手算sg函数的值,可通过前几项看出整体的规律。
例1,有一个尼姆博弈游戏,加了一个条件,就是每次取的数量k只能在[a,b]之间。
问先手能不能必胜?
题目来源:中石油4415 http://exam.upc.edu.cn/problem.php?id=4415
写写前几项的sg函数值发现:
sg(0)=0,0,....1,1,.....2,2,.....,有规律,即每个数字出现a次后,加1后继续,每(a+b)项一个循环。
所以sg(x) = x%(a+b)/a;(这里是整除)
然后把所有堆的sg值异或即可。为0则先手必败
例2,codeforces有一个尼姆博弈,规定从某堆取过某个个数k之后,之后再从这堆取的时候就不能取k了。
也是通过sg前几项推出整体的规律。