算法总结
博弈的题感觉需要找规律,刚开始看了题感觉自己推得话有点推不出来,然后看了学长发的博客里的三种经典的博弈算法,然后比着做了几题模板题,感觉对博弈有了一点小小的理解,博弈这种游戏是一种不公平的游戏,因为游戏开始的时候就已经结束了,因为双方都采用最优的办法,所以影响胜负的关键就是你面对的局面,所以结局在开始时就已经确定了,博弈题可能你需要花几个小时找规律,但是只花几分钟就把代码写出来。
- 巴什博奕(Bash Game):
只有一堆物品,两个人轮流从其中取出物品,规定最少取一个,最多取m个,最后取光者为胜。这个算法中用到了同余理论,若n = m+1,则无论先手取走多少,后手一定能够一次取走剩下的全部物品,这时后手必胜,若n = (m+1)*r+s,且s<=m, r为任意自然数,此时只要先手取s个,那么后手取k个,然后先手再取m+1-k个,也就是某一组m+1个中剩下的物品,这时总数成为(m+1)*(r-1),所以局面成为m+1的任意倍那么在接下来的游戏过程中无论后手取多少先手总是可以把总数恢复到(m+1)的整数倍上去,一直这样先手必胜.由此可以总结出求s = n%(m+1),若s不为零,则先手必胜,若k为零,先手面临的就是总数位(m+1)的整数倍的情况,所以此时先手必败。
- 威佐夫博弈(Wythoff Game):
有两堆任意数量的物品,两人轮流从其中一堆取至少一件物品,或者从两堆中同是取相同数量的物品, 规定最后取完者胜利。两堆(a,b)(a<b)个物品,每次从中取k个物品或同时从两堆物品中取k个物品,最后面对(0,0)局面的输。
规律如下:a = 【k*(1+sqrt(5.0)/2)】*b = a+k(k为自然数),如果给出的a和b满足这个公式那么将是先手必输的局面。
- 尼姆博弈(Nimm Game):
有n堆物品每堆数量有m个,两人轮流取,每次取某一堆中不少于一个,最后取完者胜。假如有3堆物品,(0,0,0)状态时先手是一个必输局势,因为没有东西可取,(0,n,n)状态时先手也是必输,只要后者在另外一堆中取和先手一样的物品数时,前者必输。如果我们将其转化成二进制的形式并通过异或运算会发现,所有的堆得数量累异或后只要为0都是必输局势。