码迷,mamicode.com
首页 > 其他好文 > 详细

Nim游戏

时间:2017-08-23 10:29:58      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:回合制   tar   需要   一个   alice   [1]   最优   不能   进制   

  给定 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游戏

标签:回合制   tar   需要   一个   alice   [1]   最优   不能   进制   

原文地址:http://www.cnblogs.com/Sdchr/p/7416355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!