所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种,大致上是这样的:
问题:
有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:
1、在一堆石子中取走任意多颗;
2、在两堆石子中取走相同多的任意颗;
约定取走最后一颗石子的人为赢家,求必胜策略。
分析:
首先我们应该找出前几个奇异局势(即必败态p)
第一个:(0,0)当先手面对(0,0)时没有可取的,就输了。
第二个:(1,2)先手输,先手只有四种取法,
1)取 1 中的一个,那么后手取第二堆中两个。
2)取 2 中一个,那么后手在两堆中各取一个。
3)在 2 中取两个,那么后手在第一堆中取一个。
4)两堆中各取一个,那么后手在第二堆中取一个。
可以看出,不论先手怎么取,后说总是能赢。所以先手必输!
第三个: (3 5)先手必输。
首先先手必定不能把任意一堆取完,如果取完了很明显后手取完另一堆先手必输,那么:
假如看取一堆的情况,假设先手先在第一堆中取:
取 1 个,后手第二堆中取4个,变成(1 ,2)了,上面分析了是先手的必输局。
取 2 个,后手第二堆中取3个,也变成( 1 , 2)局面了。
假设先手在第二堆中取:
取 1 个,那么后手在两堆中各取 2 个,也变成 ( 1 , 2 )局面了。
取 2 个 ,那么后手可以两堆中都去三个, 变成 ( 0 , 0)局面,上面分析其必输。
取 3 个,后手两堆各取 1 个 ,变成( 1 , 2)局面了。
取 4 个,后手在第一堆中取一个,变成( 1 , 2)局面了。
可见不论先手怎么取,其必输!
依次可得:
第四个(4 , 7)
第五个( 6 ,10)
第六个( 8 ,13)
第七个( 9 , 15)
第八个(11 ,18)
会发现他们的差值是递增的,为 0 , 1 , 2, 3, 4 , 5 , 6, 7.....n。
而且满足对(ak,bk)有
再找规律的话我们会发现,ak = 差值 * 1.618(ak<bk) ,而1.618 = (sqrt(5)+ 1) / 2 。
所以:ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n )方括号表示取整函数。
具体地说, 对于任意(n,m),int k=m-n;如果int tmp=double(k*(1.0+sqrt(5.0))/2.0)==n,那么(n,m)肯定是奇异局势,也就是必败点了。
练习:http://acm.hdu.edu.cn/showproblem.php?pid=1527
http://acm.hdu.edu.cn/showproblem.php?pid=2177