zoukankan      html  css  js  c++  java
  • (转)Nim游戏的一个扩展的证明(Moore’s Nimk and Mis`ere)

    Moore’s Nimk

    Nim游戏的简单扩展,不过证明我还是想了一些时间的。

    n堆石子,每次从不超过k堆中取任意多个石子,最后不能取的人算失败。
    把n堆石子的石子数用二进制表示,统计每一二进制位上的1的个数,若每一位上1的个数mod (k + 1)全为0,则必败。否则必胜
    证明:
    1.显然终止局面全为0满足命题,为必败态

    2.对于某个局面,若存在某些二进制位上的1的个数mod (k + 1)不为0,则一定存在一个合法的移动,使得每一个二进制位上的1的个数mod(k + 1)等于0。设1的个数mod(k + 1)不为0的最高二进制位上有m个1,则把这些1都变成0,记此时改变的堆数为m,若遇到下一个1的个数mod(k + 1)不为0的二进制位上有r个1,设原来改变的m堆在这一二进制位上有a个1和b个0。若a >= r,则把其中r个1->0;若b >= k + 1 - r,则把其中k + 1 - r个0->1;否则,有a < r且b < k + 1 - r,选择原来改变的m堆以外的r - a堆,这r-a堆在该位上是1,此时改变的堆数为a + b + r - a = b + r < k + 1 - r + r = k + 1,故为合法的移动。重复上述操作,必然能使得每一位上的1的个数mod (k + 1)都为0。

    3.对于某个局面,若每一个二进制位上的1的个数mod (k + 1)都为0,则一定不存在某个合法的移动,使得移动后每一二进制位上的1的个数mod (k + 1)都为0。因为最多对k堆石子做改变,所以不可能在某一位改变k + 1个1或0,使得mod(k + 1)仍为0,必然需要做偶数个0->1和偶数个1->0,对于1->0的这堆,必然存在高位,从1->0,要使高位的操作成立,又需要某一堆在这一位上0->1,依次类推,最后在最高位上存在一堆是0->1,这是不合法的。
    证毕。

    练习:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2161

    Mis`ere Moore’s Nimk

    其他的条件一样,只是谁拿走最后一个谁输。

    我们的目标是:使得最后剩余的石子规模都是1,且堆数mod (m + 1) = 1
    开始时按照Moore’s Nimk的策略操作,直到只剩下大于1且小于等于m堆规模大于1的石子时,可取得我们的目标状态。
    正确性证明:按照Moore’s Nimk的策略,必胜方取后每一个二进制位mod (m + 1) = 0,所以不可能只剩下m堆规模大于1的石子,而对手也不可能把m + 1堆规模大于1的石子一下都拿走,所以最后一定会剩下小于等于m堆规模大于1的石子让必胜方拿。
    先手必胜:
    1.石子规模都为1,且堆数mod (m + 1) != 1
    2.石子规模不全为1,且当堆数以2进制表示时,存在某一二进制位上1的和mod(m + 1) != 0

  • 相关阅读:
    (14) go 结构体
    (13) go map
    (12) go make初始化
    (11)go 数组和切片
    (10) go 错误
    (9) go 时间日期
    (8)go 字符串
    (7) go 函数
    (6) go 流程控制
    (5) go 格式化输入输出 类型转换
  • 原文地址:https://www.cnblogs.com/vongang/p/3112790.html
Copyright © 2011-2022 走看看