zoukankan      html  css  js  c++  java
  • 博弈论-一堆nim博弈合在一起

    今天A了张子苏大神的的题,感觉神清气爽。

    一篇对于多层nim博弈讲的很透彻的博文:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617

    我来整理一下:

    问题1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。 

    定义:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则, 为利己态,用S表示。

    注意:这篇博文是先定义s和t,再通过它们的性质推出结论。

    [定理1]:对于任何一个S态,总能从一堆火柴中取出若干个使之成为T态。

    证明:

    1. 若有n堆火柴,每堆火柴有A(i)根火柴数,那么既然现在处于S态, c = A(1) xor A(2) xor … xor A(n) > 0;
    2. 把c表示成二进制,记它的二进制数的最高位为第p位,则必然存在一个A(t),它二进制的第p位也是1。(否则,若所有的A(i)的第p位都是0,这与c的第p位就也为0矛盾)。
    3. 那么我们把x = A(t) xor c,则得到x < A(t).这是因为既然A(t)的第p位与c的第p位同为1,那么x的第p位变为0,而高于p的位并没有改变。所以x < A(t).而
    4. A(1) xor A(2) xor … xor x xor … xor A(n)
    5. = A(1) xor A(2) xor … xor A(t) xor c xor … xor A(n)
    6. = A(1) xor A(2) xor… xor A(n) xor A(1) xor A(2) xor … xor A(n)
    7. = 0
    8. 这就是说从A(t)堆中取出 A(t) - x 根火柴后状态就会从S态变为T态。证毕。

    [定理2]:T态,取任何一堆的若干根,都将成为S态。

    1. 证明:用反证法试试。
    2. c = A(1) xor A(2) xor … xor A(i) xor … xor A(n) = 0;
    3. c' = A(1) xor A(2) xor … xor A(i') xor … xor A(n) = 0;
    4. 则有:
    5. c xor c' = A(1) xor A(2) xor … xor A(i) xor … xor A(n) xor A(1) xor A(2) xor … xor A(i')  xor … xor A(n) = A(i) xor A(i') =0
    6. 进而推出A(i) = A(i'),这与已知矛盾。所以命题得证。

    [定理 3]:S态,只要方法正确,必赢。 

    1.   最终胜利即由S态转变为T态,任何一个S态,只要把它变为T态,(由定理1,可以把它变成T态。)对方只能把T态转变为S态(定理2)。这样,所有S态向T态的转变都可以有己方控制,对方只能被动地实现由T态转变为S态。因为全零属于T态,故S态必赢。(不能单单从对称拿取来考虑这个问题。例如a=b xor c,然后求sg这种情况。因为证不出来。。定理1只是说存在这种情况,并没有说对称拿取。)

    [定理4]:T态,只要对方法正确,必败。 

    1.   由定理3易得。 

    问题2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。

    【未完待续】

  • 相关阅读:
    少壮不努力,老大徒伤悲
    吾日三省吾身
    记录生活
    为人处世
    时间不等人
    博客两年记忆
    抬起头吧
    下一步计划
    寻找遗失的平静
    暑假第二十六测
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/7399853.html
Copyright © 2011-2022 走看看