時間限制: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"
樣例輸入
33 2 1
樣例輸出
bob
這一次我們講的是乙個古老而又經典的博弈問題:nim遊戲。
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局面的轉移性質,所以該結論的正確性也得到了證明。
1 #include 2using
namespace
std;34
intn, p, a;56
intmain()
13if (p == 0) cout << "
bob"
<14else cout << "
alice
"<16return0;
17 }
hihocoder博弈遊戲 Nim遊戲 三
在這一次遊戲中alice和bob決定在原來的nim遊戲上增加一條規則 每一次行動時,不僅可以選擇一堆取走任意數量的石子 至少取1顆,至多取出這一堆剩下的所有石子 還可以選擇將一堆石子分成兩堆石子,但並不取走石子。比如說有一堆石子為k個,當alice或者bob行動時,可以將這一堆石子分成兩堆,分別為x...
組合遊戲(博弈)
昨天看大白書翻到了組合遊戲這章,看著發覺原來是博弈論的內容,於是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不過好在還是集中精神地看了大部分。從nim遊戲 n堆石子,每人每次可以從任意一堆中取至少1個 至多整堆的石子,不能取者為輸 開始講起,引入必勝態 必敗態的概念 1.乙個狀態是必敗狀...
博弈 塗色遊戲
在乙個2 n的格仔上,alice和bob又開始了新遊戲之旅。這些格仔中的一些已經被塗過色,alice和bob輪流在這些格仔裡進行塗色操作,使用兩種塗色工具,第一種可以塗色任意乙個格仔,第二種可以塗色任意乙個2 2的格仔。每一輪遊戲裡,他們可以選擇一種工具來塗色尚未被染色的格仔。需要注意,塗色2 2的...