1. 程式人生 > >Nim遊戲

Nim遊戲

i+1 兩個 最優 nim nim遊戲 .... 證明 得到 bob

  給定 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遊戲