1. 程式人生 > 遊戲攻略 >《雲頂之弈》11.17版本強勢陣容排行

《雲頂之弈》11.17版本強勢陣容排行

博弈論基礎介紹:

巴什博弈:

例子:

一堆石子 \(n\) 個,任意取 \([1-m]\) 個,問先手必贏/輸。

分析:

分類進行考慮:

  1. \([1,m]\) 個,先手必贏。
  2. \(m+1\) 個,先手必輸。
  3. \([m+2,2m]\) 先手可以拿走幾個,剩下 \(m+1\) 個,先手必勝。

我們發現,面臨 \(m+1\) 個石子的人一定失敗。

進行推廣:設當前石子數為 \(n=k*(m+1)+r\), 先手先拿走 \(r\) 個,無論後手怎麼拿 \(x\) 個,先手一定可以拿走 \(m+1-x\) 個,這樣後手一定失敗。

反之,當 \((m+1)|n\) ,先手一定失敗。

因此,只要不滿足 \((m+1)|n\)

,就一定先手必勝,反之必敗,直接判斷即可。

\(nim\) 遊戲

例子:

\(n\) 堆石子,兩個人可以從任意一堆石子中拿任意多個石子(不能不拿),沒法拿的人失敗。問誰會勝利。

定理:

\(n\) 堆石子的數量異或和等於 \(0\) 時,先手必敗,否則先手必勝.

證明:

必敗狀態:我們設 \(a[i]\) 表示 \(i\) 堆石子的數量。當前局面為:

\[0⊕0⊕0⊕⋯⊕0=0 \]

對於先手來說,如果當前局面為:

\[a_1⊕a_2⊕a_3⊕⋯⊕a_n=k \]

那麼一定存在 \(a_i\) ,二進位制表示在最高位 \(k\) 上為 \(1\)

我們將 \(a_i⊕k\) ,這樣就變成了:

\[a_1⊕a_2⊕a_3⊕⋯⊕a_n⊕k=0 \]

我們只需要保證給後手的人所有石子異或值為0,即可獲勝,此時先手必勝。

反之,一開始異或值為 \(0\) ,此時先手必敗。

特殊情況:

有些題目,只能選擇 \([1-m]\) 個石子,這就是 \(nim+bash\) ,只需要將所有的石子堆的石子數目同時模 \(m+1\),然後異或運算即可。

for(int i=1;i<=N;i++) scanf("%d",&a[i]);
for(int i=1;i<=N;i++) ans=ans^a[i];
ans==0?printf("No\n"):printf("Yes\n");