Nim游戏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nim游戏相关的知识,希望对你有一定的参考价值。

  给定 n 堆石子, 第 1 堆石子有 a[1] 个, 第 2 堆石子有 a[2] 个, .... , 第 n 堆石子有 a[n] 个.

  Alice 和 Bob 进行回合制游戏, Alice 先手.

  每个回合, 当前操作方可以选择其中的一堆石子, 并在这堆石子中取走任意个, 但是不能不取.

  谁拿完所有的石子, 谁赢.

  问谁有必胜策略.

 

  我们尝试将状态划分为必胜态和必败态.

  对于必胜态, 它的所有后继都为必败态.

  对于必败态, 它存在一个后继为必胜态.

  定义映射 $f : 状态 \rightarrow \left\{ 必胜态, 必败态 \right\}$ .

 

  我们探究两个石子的情况, 可以得到一个基本的结论: $f(\left\{ Y, Y \right\}) = 必败态$ .

  $f(X, X, Y) = f(Y)$ .

  我们尝试将每一堆拆成若干个二进制的相加, 然后引用上述结论, 就得到了下面的定理.

 

  设 x = a[1] ^ a[2] ^ a[3] ^ ... ^ a[n] .

  当 x = 0 时, 当前状态是必败态.

  当 x != 0 时, 当前状态是必胜态.

  证明

    (1) 当 x != 0 时, 

      a[1] ^ a[2] ^ ... ^ a[n] ^ x = 0 .

      设 x 的二进制最高位为 w , 那么一定存在 i , 使得 a[i] 存在位 w .

      那么 a[i] > (a[i] ^ x) , 因为除去了 x 的最高位 w .

      所以只需要将 a[i] 变为 (a[i] ^ x) 即可.

    (2) 当 x = 0 时,

      假设存在 i , w , w < a[i] , 使得 a[1] ^ a[2] ^ ... ^ a[i-1] ^ w ^ a[i+1] ^ ... ^ a[n] = 0 .

      那么有 w ^ a[i] = 0 即 w = a[i] , 矛盾.

 

  根据上面的证明过程, 我们也知道:

    对于必胜态, 当前的最优策略是选取满足 a[i] > a[i] ^ w 的一个数, 并将 a[i] 变为 a[i] ^ w .

    且根据上述证明过程我们可以得知, 这种数一定是存在的.

以上是关于Nim游戏的主要内容,如果未能解决你的问题,请参考以下文章

博弈论Nim游戏:台阶集合拆分(AcWing)

NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结

1069 Nim游戏

BZOJ 3105:[cqoi2013]新Nim游戏

LeetCode 292 Nim Game(Nim游戏)

AcWing 算法基础课 容斥原理Nim游戏