巴什博奕(Bash Game)
首先考虑一个简单的例子:
>A和B一起报数,每个人每次最少报一个,最多报4个。轮流报数,看谁先报到30.
因为最多可以报4,最少报1,如果对方开始报,那么我开始总是可以报5的。依次类推,我都可以想法儿报5的倍数。所以,结论就是,先手必输。
可以将例子抽象一下:
如果最多可以报n,最少可以报m个,看谁先报到a;
判断a%(m+n)是否大于n即可。如果大于后手胜,否则先手胜。
原先在东师的校赛上,见过类似的一道题。当时,还不知道这个模型。自己也没搞出来。唉!智商压制呀!
威佐夫博奕(Wythoff Game)
这个模型就比上一个难了一点。
适用的游戏情况
首先有两堆石子,博弈双方每次可以取一堆石子中的任意个,不能不取,或者取两堆石子中的相同个。先取完者赢。
我们首先用一个二维数组来记录两堆石子的剩下的数量。
如果一个人遇到了(0,0)这个状态,那么他已经输了。我们把这种状态叫做失败态,也叫奇异状态。
那么向前推一下,接下来的失败态为(1, 2),(3, 5),(4, 7),(6, 10),……
如果我们将失败态中的第一个数字和第二个数字分别存储在a,b两个数组里,那么可以得到的规律为:
- b[i] = a[i]+i; (i从0开始)
- a[i] 是之前状态没有出现的最小整数
由以上规律可以算出(反正我是不会了,上结论吧):
a[i] = [i*(1+√5)/2] 或者 a[i] = [i * 0.618]; (这里的中括号表示向下取整)
所以只要判断一下初始堆的情况是否是失败态。失败态先手必败,否则后手必败。
尼姆博奕(Nimm Game):
这就是比较著名的NIM游戏了,和SG函数有很大的关系哦。
这里就不再赘述了,详见我其他的博文。