首页 > 技术文章 > 博弈论

icodefive 2016-01-15 13:44 原文

1.nim游戏

  nim游戏的一般描述是这样的,有n堆石子,AB两个人每轮分别可以从某一堆石子中选择任意多个拿走,若到某一轮某个人不能拿石子了,那么判这个人输。如果这两个人都足够聪明的话,那么A先选择的话谁能够获胜。

  我们称非必胜态的状态为必败态。  

  结论是全部异或操作之后结果为零时为必败状态,其余状态为必胜态。

  证明

  (1)当n等于2的时候

  两堆石子个数相同的时候为必败态,因为后手可以模仿先手而将两堆石子的数量调成相同,如先手将某一堆拿走m个石子,那么后手可以在另一堆拿走m个已达到两堆石子相同,那么先手必定会面领两堆石子都为0的状态。

  (2)以n>2的时候

  证明如下三点的时候能够证明某一状态是否为必胜态。

  (1)某状态的下一个状态的所有情况都为必胜态的时候,此状态为必败态。

  (2)某状态下有必败态的时候,则此点为必胜态

  (3)终点状态可确定

  将所有堆的石子数做异或运算,令结果为0时为a状态,其他状态为b状态。

  所有堆石子数均为零时为必败态,也为a状态,我们只要证明a状态的下一个状态必为b状态,b状态的下一个状态可以为a状态。那么b状态即为必胜态。

  证明① b状态一定能转化成a状态

      设b状态时所有堆数异或结果为x,设x的二进制最高位位为w,找出x的最高位所在的石子堆(设此石子堆的石子数位y),将此石子堆的数量变成y^x,此时相当与拿掉了y并且加入了一个y^x的石子堆,异或结果为x^y^(y^x)为0,也可以很显然的知道y一定是大于y^x的。

  证明② 异或结果是零的下一步不可能是异或结果为零。

    每个堆里面含有不同的一些二进制位,相同的二进制位必定存在于不同的两个堆里面。

 

推荐阅读