• 博弈论


    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的。

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

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

  • 相关阅读:
    C# 使用委托实现回调功能
    java 调用 .net webservice 去掉方法里参数的命名空间前缀
    C# 判断对象里所有属性的值是否存在空值
    postman配合soupui调用webservice
    Web Browser Control – Specifying the IE Version
    MySql 中文乱码处理
    Windows Telnet服务端口配置(转)
    .Net程序集强签名详解
    xmlns + SelectNodes = empty XmlNodeList
    【转】动态调用WebService(C#)
  • 原文地址:https://www.cnblogs.com/icodefive/p/5109457.html
Copyright © 2020-2023  润新知