zoukankan      html  css  js  c++  java
  • [学习笔记]nim游戏

    普通nim游戏:

    n堆石子,每个人每次对着一堆拿若干个。不能拿者判输。

    只有两种情况,先手必胜,先手必败。

    先手必胜当且仅当:a1^a2^...^an!=0

    证明:

    设=x(x不为0),选择最高位和x一样的ai,显然有ai^x<ai

    阶梯型nim游戏

    阶梯型nim游戏:高度单调的阶梯。每次只能把a[i]中选择x个,放到a[i-1]中,或者把a[1]中扔掉若干个。问有无先手必胜策略。

    等价于对奇数堆做nim游戏。

    第一次先手,就把奇数堆按照必胜策略移动。偶数堆不管,当做垃圾桶。

    如果后手移动奇数堆到偶数堆,就按照奇数堆必胜策略移动。

    反之,就把后手移动过来x的奇数堆再往前移动x个。对于奇数堆的状态不变。早晚会把偶数堆移动完。

    所以,等价。

    反向nim游戏

    有 N 堆石子,每次可从一堆石子中拿走任意数量的石子。

    两个人轮流拿,谁不能拿谁赢。

    上面的必胜和必败都是基于“无法操作者败”这个规则来解释的。

    若某组合游戏的胜利条件是“无法操作者胜”的话,必胜态必须满足二者之一:

    SG异或和>0且石子数>1的堆数>0

    SG异或和=0且石子数>1的堆数=0

     证明。。。

    Nim-K 游戏

    有 N 堆石子,每次可从 K 堆石子中拿走任意数量的石子。

    两个人轮流拿,谁不能拿谁输。

    证明:

    数学归纳法

    1.没有石子的时候,一定全部为0

    2.如果当前全部为0,最多某一位1的个数变化k个,一定不会全部为0

    3.如果当前不全为0,从高位开始往低位找,

      如果某一位1的个数为b,之前已经动过的堆数为c,先用c个动过的堆来调整,让b变成0或者k+1,不够用,就从剩下的b的堆把1删去(大概就是先都往0凑,加上新选择的堆还不行的话,那么一定可以直接凑出k+1,直接用c个原来的堆往k+1凑)

      删去1的堆一定已经取走,所以后面就可以随便0->1或者1->0了,加入那c个。如果能操作k个,那么一定可以随心所欲了。

    证毕。

    小例题:

    两人之间的距离就是石子数量。都撞上了以后,谁撤,对面立刻怼上去。

  • 相关阅读:
    Python os 模块
    Python sys 模块
    [SAP BASIS]How to kill process in SAP ?
    linux lsof 详解
    [ORACLE] Oracle 索引失效总结
    [SAP BASIS] [TMS] 更改 Backup-Domain-Controler as Domain Controller|将TMS备用域控制器改为主域控制器
    python 生产者消费者模型
    Python 多线程
    python queue 模块
    [Linux]ipcs,ipcm 命令详解
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9831078.html
Copyright © 2011-2022 走看看