前几天在网上学习了一下SG函数,稍微了解了大概,觉得自己动手理一下可以加深印象。
SG函数的使用似乎都和Nim游戏有关。
首先理清几个概念:
P点:必败点,处于此位置时,在双方采取最佳策略时必败。
N点:必胜点,处于此位置时,在双发采取最佳策略时必胜。
P点与N点的性质:
1.所有终结点都是必败点。(比如取石子时面对三堆石子的状态是(0,0,0),则无法取物,败。而(0,0,0)为终结点,由此可得此性质。)
2.从必胜点N可以一步到达必败点P;(所有能一步走到P的就是N点)
3.P只能进入N点。(通过一步只能到达N的是P点。)
通常分析必胜点和必败点都是以终结点逆序分析的。
下面介绍SG定理和SG函数:
SG定理:
各个游戏SG函数的Nim和 等于游戏和的SG函数。(即如果当前状态由几个部分组成,则当前状态的SG等于这几个部分SG的异或值。和Nim游戏一样,如果每堆有x个石子,则这一堆的SG为x,N堆的SG为每堆SG的异或。)这样就可以将游戏划分为若干个子游戏,然后对每一个子游戏分而治之,从而简化问题。
而Bouton定理(状态(x1,x2,x3)为必败状态,当且仅当x1^x2^x3=0,即Nim和为0)可以看做是SG定理在Nim游戏中的运用(练习:UVALive/LA 5059+UVA 10561+UVA 12293)。
SG函数
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示不属于该集合的最小非负整数。如:mex{0,1,2,4}=3,mex{2,3,6}=0,mex{}=0。
对于任意状态x,定义SG(x)=mex(S),其中S是x后继状态的SG函数的集合。比如x有3个后继状态:SG(a)、SG(b)、SG(c),则SG(x)=mex{SG(a),SG(b),SG(c)}。若x为终态,则x的后继状态为空集,所以SG(x)=mex{}=0。即集合S的终态为空集,所以x为必败点P 当且仅当 SG函数的终态为SG(x)=0。
(因为x为必败点,所以当到达终态时,x的后继为空集,即在选择之前已经取光,无法进行任何选择,所以SG(x)=0)
(一个状态是必败态当且仅当它所有后继都是必胜态;一个状态是必胜态当且仅当至少有一个后继是必败态。)
来个网上的例子加深下对后继状态的了解。
【实例】取石子问题
有1堆n个石子,每次只能取{1,3,4}个,先取完者胜,则各个状态的SG值为多少?
首先知道当状态x=0时,无法选取石子,没有后继状态,所以SG[0]=mex{}=0,可以取的状态为f[]={1,3,4}。
当前有1个石子(即面对状态x=1),只能取走1个石子,所以剩余{0}个,SG[1]=mex{SG[0]}=mex{0}=1。(0即为1的后继状态。)
当前有2个石子(即面对状态x=2),只能取走1个石子,所以剩余{1}个,SG[2]=mex{SG[1]}=mex{1}=0。(1为2的后继状态。)
当前有3个石子(即面对状态x=3),可以取走1,3个石子,所以剩余{2,0}个,SG[3]=mex{SG[2],SG[0]}=mex{0,0}=1。
当前有4个石子(即面对状态x=4),可以取走1,3,4个石子,所以剩余{3,1,0}个,SG[4]=mex{SG[3],SG[1],SG[0]}=mex{1,1,0}=2;
当前有5个石子(即面对状态x=5),可以取走1,3,4个石子,所以剩余{4,2,1}个,SG[5]=mex{SG[4],SG[2],SG[1]}=mex{2,0,1}=3;
以此类推……
可以得到:
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
SG[x] | 0 | 1 | 0 | 1 | 2 | 3 | 2 | 0 | 1 |
1.使用数组f将可改变当前状态的方式记录下来。(如上述中每次只能取{1,3,4}个石子,则f[]={1,3,4}。)
2.使用另一个数组标记当前状态x的后续状态。
3.最后模拟mex运算,即搜索未被标记的最小非负值,将其复制给SG[x]。
4.不断重复2-3步,至完成1-n的SG函数值。
网上还给了一道实战演练:hdu-1848。(链接)
还有一些组合博弈的题目,先列下来,慢慢刷。
POJ 2234 Matches Game
HOJ 4388 Stone Game II
POJ 2975 Nim
HOJ 1367 A Stone Game
POJ 2505 A multiplication game
ZJU 3057 beans game
POJ 1067 取石子游戏
POJ 2484 A Funny Game
POJ 2425 A Chess Game
POJ 2960 S-Nim
POJ 1704 Georgia and Bob
POJ 1740 A New Stone Game
POJ 2068 Nim
POJ 3480 John
POJ 2348 Euclid's Game
HOJ 2645 WNim
POJ 3710 Christmas Game
POJ 3533 Light Switching Game
主要参考博客:http://blog.csdn.net/luomingjun12315/article/details/45555495