zoukankan      html  css  js  c++  java
  • 数学--博弈论--巴什博奕(Bash Game)

    终于也轮到我做游戏了,他们做了好几个月的游戏了。

    巴什博弈:

    两个人做游戏,取石子,一个人最多可以可以取M个,至少取1个,最后取完的赢。

    显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

    举例1:先手必胜(如果是傻子就好说了)

    终结数30 ,最大可以取3个,最少取1个

    经过上面的公式推算- 3+1=4(m+1)

    正常人:

    如果先手足够聪明,那么他一定会胜利,他可以保证每次留给你剩下的数都是4的倍数 取2留28,取6留24,取10留20,取14留16,取18留12,取22留8,取26留4,先手只要取到这些点必输。

    康宝斌:

    如过先手不够聪明,留给后手反击的机会,后者就可以通过先手的失误,先达到上面的点。

    总结 谁先给对手留(m+1)倍数的数,谁就先胜利

    一个人拿1~m个,那谁面对m+1的局势的的时候则必败。假设n=k*(m+1)+s,(k为任意,s<m+1),那我(先手)先把那个s个拿掉,然后让另一个人拿,从现在开始,只要我每次拿的个数与前面一个人拿的个数和等于m+1,这样后拿的必定面对必败局势,即到最后另一个人拿完后肯定是剩t(t<m)个给我,那就是我赢。

    举例2:先手必输

    我们考虑这种情况:

    终结数20 ,最大可以取3个,最少取1个。

    无论我去多少个,我不能留给我对手K*(M+1)个,这样的后果是,我会面对K*(M+1)的情况,也就是我必输。

    总结:

    那我们讨论一下什么时候必输,什么时候必赢。

    当我一开始就面对K*(M+1)的局势,相当于对面给我制造了K*(M+1)的局势,而我是先手。

    所以判断终止数%(M+1)=0?来判断先手必输,还是必赢。

  • 相关阅读:
    ionic入门之AngularJS扩展基本布局
    ionic入门之AngularJS扩展(一)
    test
    面试题小整理
    使用Code first 进行更新数据库结构(数据迁移)
    SQL模糊查询与删除多条语句复习
    GridView 根据要求显示指定值
    个人工作记录---工作中遇到的sql查询语句解析
    数据库,inner join,left join right join 的区别
    利用set实现去重
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798560.html
Copyright © 2011-2022 走看看