hiho博弈遊戲 Nim遊戲

2021-07-02 04:46:36 字數 1998 閱讀 6241

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

描述今天我們要認識一對新朋友,alice與bob。

alice與bob總是在進行各種各樣的比試,今天他們在玩乙個取石子的遊戲。

在這個遊戲中,alice和bob放置了n堆不同的石子,編號1..n,第i堆中有a[i]個石子。

每一次行動,alice和bob可以選擇從一堆石子中取出任意數量的石子。至少取1顆,至多取出這一堆剩下的所有石子。

alice和bob輪流行動,取走最後乙個石子的人獲得勝利。

假設每一輪遊戲都是alice先行動,請你判斷在給定的情況下,如果雙方都足夠聰明,誰會獲得勝利?

輸入第1行:1個整數n。表示石子堆數。1≤n≤100

第2行:n個整數,第i個整數表示第i堆石子的個數a[i],1≤a[i]≤10000

輸出第1行:1個字串,若alice能夠獲勝輸出"alice",否則輸出"bob"

樣例輸入

3

3 2 1

樣例輸出

bob

nim遊戲是經典的公平組合遊戲(icg),對於icg遊戲我們有如下定義:

1、兩名選手;

2、兩名選手輪流行動,每一次行動可以在有限合法操作集合中選擇乙個;

3、遊戲的任何一種可能的局面(position),合法操作集合只取決於這個局面本身;局面的改變稱為「移動」(move)。

4、若輪到某位選手時,該選手的合法操作集合為空,則這名選手判負。

對於第三條,我們有更進一步的定義position,我們將position分為兩類:

p-position:在當前的局面下,先手必敗。

n-position:在當前的局面下,先手必勝。

他們有如下性質:

1.合法操作集合為空的局面是p-position;

2.可以移動到p-position的局面是n-position;

3.所有移動都只能到n-position的局面是p-position。

在這個遊戲中,我們已經知道a = 的局面是p局面,那麼我們可以通過反向列舉來推導出所有的可能局面,總共的狀態數量為a[1]*a[2]*...*a[n]。並且每一次的狀態轉移很多。

雖然耗時巨大,但確實是乙個可行方法。

當然,我們這裡會講這個題目就說明肯定沒那麼複雜。沒錯,對於這個遊戲有乙個非常神奇的結論:

對於乙個局面,當且僅當a[1] xor a[2] xor ... xor a[n] = 0時,該局面為p局面。

對於這個結論的證明如下:

1. 全0狀態為p局面,即a[i]=0,則a[1] xor a[2] xor ... xor a[n] = 0。

2. 從任意乙個a[1] xor a[2] xor ... xor a[n] = k != 0的狀態可以移動到a[1] xor a[2] xor ... xor a[n] = 0的狀態。由於xor計算的特殊性,我們知道一定有乙個a[i]最高位與k最高位的1是相同的,那麼必然有a[i] xor k < a[i]的,所以我們可以通過改變a[i]的值為a[i]',使得a[1] xor a[2] xor ... xor a[i]' xor ... xor a[n] = 0。

3. 對於任意乙個局面,若a[1] xor a[2] xor ... xor a[n] = 0,則不存在任何乙個移動可以使得新的局面a[1] xor a[2] xor ... xor a[n] != 0。由於xor計算的特殊性,我們可以知道,一定是存在偶數個1時該位置的1才會被消除。若只改變乙個a[i],無論如何都會使得1的數量發生變化,從而導致a[1] xor a[2] xor ... xor a[n] != 0。

以上三條滿足icg遊戲中n,p局面的轉移性質,所以該結論的正確性也得到了證明。

ac code:

#include using namespace std;

int main()

if(p==0)

cout<<"bob"<

hiho 1163 博弈遊戲 Nim遊戲

這個博弈可以說是很經典了,就是我總忘。nim博弈。我猜都不會在比賽裡考了吧。結論很簡單。就是所有堆取異或 為0乙個人勝,不為0另外的人勝。include include include include include include int main int m while scanf d m eo...

博弈 Nim遊戲

nim遊戲是博弈論中最經典的模型,它又有著十分簡單的規則和無比優美的結論。nim遊戲是組合遊戲 combinatorial games 的一種,準確來說,屬於 impartial combinatorial games 以下簡稱icg 滿足以下條件的遊戲是icg 可能不太嚴謹 1 有兩名選手 2 兩...

NIM遊戲 博弈

1.尼姆博弈 n堆石子,每堆的數量a1,a2,a3.an,一方取完後石子個數為0則該方獲勝,問先手是否必勝 if ans a1 a2 a3 an 0 先手必勝 else 先手必輸 延伸1 在此問基礎上新增乙個集合,集合內的數字是每次操作可取的石子個數,每次從一堆中取,最後無法取者判輸 對每堆石子算得...