• (转)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

  • 相关阅读:
    Android 列表之分组ListView
    【转】容易忽视但是功能灰常强大的Java API
    onSaveInstanceState和onRestoreInstanceState的用处
    asp.net中url重写
    泛型数据类型转换
    关于 url重写后性能问题
    用CSS实现新闻轮播效果
    Java命名规范(简略)
    关于ngclass中添加多个样式类的解决方案
    python 常用标准库
  • 原文地址:https://www.cnblogs.com/vongang/p/3112790.html
Copyright © 2020-2023  润新知