zoukankan      html  css  js  c++  java
  • [学习笔记]Nim游戏&SG函数

    SG函数

    定义

    • P-position(Previous): 当前选手的必败态
    • N-position(Next): 当前选手的必胜态

    状态转移方式

    • 无路可走时是P-position
    • 如果存在能让游戏状态变成P-position的走法,则当前状态为N-position
    • 如果所有能到达的游戏状态都是N-position,则当前状态为P-position

    性质

    由状态转移方式推得

    1. 所有terminal position为P-position
    2. N-position的游戏状态一定可以转移到某个P-position
    3. P-position的游戏状态不可能转移到别的P-position

    只要满足上面三条性质,则游戏状态合法.

    应用

    • mex运算: 表示最小的不属于这个集合的非负整数

    • 对游戏状态建DAG

    • SG函数f(x)=mex{f(y)|x->y\(\in\)DAG}
      假设f(x)=0为必败态(P-position),反之为必胜态(N-position)

      1. 所有terminal position无出边,f(x)=0
      2. f(x) \(\neq\) 0时,存在一条出边指向的y满足f(y) \(=\) 0
      3. f(x) \(=\) 0时,所有出边指向的y满足f(y) \(\neq\) 0

      满足三条性质

    Nim游戏及其变体

    Nim Game

    n堆石子, 两个人轮流操作, 每次可从任意一堆中取出任意多>0的石子, 无法操作者输.

    • 结论:P-position为所有石子数的异或和=0.
    • 证明:
    1. terminal position,即石子数都为0,为P-position.

    2. 若当前为N-position,即异或和k(设最高位为x)不为0,则必存在石子数\(a_i\)的位x为1,满足\(a_i\;xor\;k<a_i\).
      \(a_i-a_i\;xor\;k\)即可.

      \(\begin{aligned}&a_1\;xor\;a_2\;xor...xor\;(a_i\;xor\;k)\;xor...xor\;a_n\\=&a_1\;xor\;a_2\;xor...xor\;a_i\;xor...xor\;a_n\;xor\;k\\=&k\;xor\;k\\=&0\end{aligned}\)

      转移到了某个P-position.

    3. 若当前为P-position,即异或和为0,则无论怎么取,取后异或和必不为0,即不可能转移到别的P-position.

    Nimk Game

    n堆石子, 两个人轮流操作, 每次可从任意\(\small{\leq}\)k堆中取出任意多>0的石子, 无法操作者输.

    • 结论:P-position为在二进制下,每一位上的1的个数和mod (k+1)都为0.
    • 证明:
    1. terminal position,即石子数都为0,为P-position.
    2. 若当前为N-position,即存在某一位上的1的个数和mod (k+1)不为0,从高位往低位确定每堆石子取的个数.
      假设已经使前i-1上的1的个数和mod (k+1)=0,现在考虑第i位.
      对于已经改变的m堆,当前位可以自由选择变与不变(不会增加取的堆数).
      记n为除已经改变的m堆外,当前位为1的堆数mod (k+1)的值.
      若n+m\(\leq\)k,则直接全取这n+m堆这一位的1,m=n+m. 此时转移到了某个P-position.
      否则,n+m>k即n+m\(\geq\)k+1,此时n\(\geq\)k+1-m,在这m堆中,留k+1-n堆这一位的1,其余1全取走. 此时转移到了某个P-position.
    3. 若当前为P-position,即每一位上的1的个数和mod (k+1)都为0,则无论怎么取,取后必存在某一位上的1的个数和mod (k+1)不为0,即不可能转移到别的P-position.

    Bash Game

    n堆石子,两个人轮流操作,每次可从任意一堆中取出[1,m]个石子,无法操作者输.

    • 结论:P-position为所有石子数\(mod\;(m+1)\)后的异或和=0.

    • 证明:

    1. terminal position,即石子数都为0,为P-position.

    2. 若当前为N-position,即异或和k(设最高位为x)不为0,则必存在石子数\(a_i\;mod\;(m+1)\)的位x为1,满足\(a_i\;mod\;(m+1)\;xor\;k<a_i\).
      \(a_i-a_i\;mod\;(m+1)\;xor\;k\)即可.

      \(\begin{aligned}&(a_1\;mod\;(m+1))\;xor...xor\;(a_i\;mod\;(m+1)\;xor\;k)\;xor...xor\;(a_n\;mod\;(m+1))\\=&(a_1\;mod\;(m+1))\;xor...xor\;(a_i\;mod\;(m+1))\;xor...xor\;(a_n\;mod\;(m+1))\;xor\;k\\=&k\;xor\;k\\=&0\end{aligned}\)

      转移到了某个P-position.

    3. 若当前为P-position,即异或和为0,则无论怎么取,取后异或和必不为0,即不可能转移到别的P-position.

    Staircase Nim

    n阶台阶, 每次可以从一个台阶上拿掉任意数量石子放到下一层台阶, 无法操作者输(第1级可以往地面上放).

    • 结论:P-position为所有奇数级的石子数的异或和=0.
    • 证明:
    1. terminal position,即所有石子都在第0级,奇数级石子数异或和为0,为P-position.
    2. 若当前为N-position,即若当前奇数级异或和不为0,则必存在奇数级石子数\(a_i\)的位x为1,满足\(a_i\;xor\;k<a_i\). 取\(a_i-a_i\;xor\;k\)即可转移到某个P-position.
    3. 若当前为P-position,即若当前奇数级异或和为0,则移奇数级到偶数级后,奇数级异或和不为0,即不可能转移到别的P-position.

    Anti Nim

    n堆石子, 两个人轮流操作, 每次可从任意一堆中取出任意多>0的石子, 取走最后一颗石子的人输.

    • 结论:N-Position为以下两种情况之一:
      1. 所有堆石子数都为1且堆数为偶数
      2. 存在某堆石子数大于1且石子堆的异或和≠0
    • 证明 :
    1. terminal position,即只剩一个石子数为1的堆,为P-position.
    2. 若当前为N-position,
      1. 若所有堆石子数都为1且堆数为偶数,任取一堆即可转移到某个P-position.
      2. 若存在某堆石子数大于1且石子堆的异或和≠0,参考Nim Game,可转移到某个P-position.
    3. 若当前为P-position,
      1. 若所有堆石子数都为1且堆数为奇数,无论取哪堆都会转移到某个N-position,即不可能转移到别的P-position.
      2. 若存在某堆石子数大于1且石子堆的异或和=0,由异或和=0得至少存在两堆得石子数>1. 无论取哪堆都会使石子堆的异或和≠0(转移到某个N-position),即不可能转移到别的P-position.

    2017-10-25 20:40:09

  • 相关阅读:
    Matrix Power Series
    The Noisy Party(BUPT)
    cony
    又见Fibonacci数列
    回文字符串
    街区最短路径问题
    点的变换
    可恶的麦兜(北邮)
    Travel
    Swing实现Java代码编辑器实现关键词高亮显示
  • 原文地址:https://www.cnblogs.com/AireenYe/p/NimAndSG.html
Copyright © 2011-2022 走看看