简介SG函数:
SG函数是对游戏中每个节点的评估函数。它的定义如下:
F(v)=mex{f(u)图中有一条v到u的边}
其中,mex(minmal excludant)是定义在整数集合上的操作。它的自变量是任意整数集合,函数值是不属于该集合的最小自然数。
事实上,所有的SG-组合游戏都存在相应的游戏图,我们完全可以根据游侠的拓扑关系来逐一算出每个状态点的SG函数(事实上我们只需要知道该节点的SG函数值是否为0).这样,我们就可以知道对于某一个状态,是先手必胜局还是先手必败局。对应问题:
经典SG问题:
取石子游戏:
桌面上有N堆石子,游戏者轮流取石子。每次只能从一堆中取出任意数目的的石子,但是不能不取。
(1) 最后取走石子的获胜。
(2) 最后取的失败。Pku 3480
(3) 只能取固定数目的额石子。(回到问题的王道,求SG函数)hdu 1536
SG问题的性质:
对于任意局面如果它的SG函数为0,那么它的任意一个后继局面SG值不为0。对于任意的局面如果它的SG值不为0,那么它一定有一个后继局面的SG值为0。
(1) 这个问题的SG函数值就等于石子的数目。原因很简单,取石子的时候,除了0个石子,都能拿,也就是除了了n,0~n-1都是该状态的前继。所以SG为n。然后就是多个石子堆的时候,前一个为0,那么下一个状态一定为1。反之亦是如此。故当所有石子的异或结果为0时,为先手胜。
(2) 这个是anti-sg问题。可以分析。
(a) 当所有石子均为1时,先手胜,石子数目必为偶数SG为0。
(b) SG不为0时,若只有一堆石子,数目大于1,先手必能采取最有决策。必胜。若有多对石子,先手将SG变为0(因为SG为0,是先手必败局)。
(c) SG为0时。先手决策完后,必定至少有一堆石子大于1,且SG不为0,将会进入先手必胜局(先手必败)。
所以,当SG为0,max(num)为1的时候先手,SG不为0,max(num)大于1时,先手必胜。
(3) 这个问题就是求SG函数。遍历求对应节点的前驱。然后从前向后遍历求SG函数值。
参考:贾思豪 组合游戏略述 ——浅谈SG游戏的若干拓展及变形