NIM游戏

    Nim游戏是博弈论中最经典的模型之一。

   通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

  当石子堆数很少时,我们直接分析出必胜策略,但是石子堆数很多时,分析起来难道就大大的增加了。所以我们应该换种方法分析了。

  

  我们将所有的状态分为两种P状态与N状态,P代表Previous(过去),N代表Next(下一个)。定义N状态为先手必胜状态,P状态为先手必败状态。(先手是指当前移动的人)

  简单分析可得:

            1.无法移动任何石子的局面为P状态

            2.可以移动到P状态的都是N状态。

            3.所有移动都是N状态的局面是P状态。

  于是我们就可以用dp+记忆化搜索的方法解决这个问题了。递归计算一个状态的所有子状态的性质,如果存在某个子状态是P状态,那么向这个子状态的移动就是必胜策略,此状态就是N状态。由于存在很多重叠子问题,所以可以使用记忆化搜索的方法进行优化。

  对于某个Nim游戏的局面(a1,a2,...,an),需要计算O(a1*a2*...*an)个局面的性质,时间复杂度较高。



  我们要感谢L.Bouton大神,他在1902年给出了这样一个定理:

       P状态当且仅当a1^a2^...^an=0   (^为XOR)

  证明:

       结束状态必为0,0,0,0,0,0...... ans=0^0^0^0.......=0

       对于任何面对此状态的人它必然会输,毋庸置疑吧!

       然后就是此状态的前一状态必定ans不为0。

       好了,对于任何一个状态只要其ans不为0,面对当前状态的人都可以取石子使得下一人面对状态的ans为0。然后对于任何ans为0的状态,其下一个状态ans必然不为0。所以对于ans不为0状态的后手来说,其所取状态的ans都为0,结束状态也必然在其中。

      所以对于任何一个ans不为0的状态都是先手必胜的,也就是N状态。

     

      此证明为笔者原创,由于笔者水平,若有不足,请见谅。

  

  于是,我们解NIM游戏问题就变得无比简单了。orz L.Bouton







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值