您的位置:首页 > 编程语言 > Go语言

威佐夫博弈

2015-07-24 11:40 381 查看
 所谓威佐夫博弈,是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
      

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息