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游戏的主要内容,如果未能解决你的问题,请参考以下文章