博弈 Nim遊戲

2022-05-12 03:44:00 字數 1965 閱讀 9807

1069 nim遊戲

基準時間限制:1 秒 空間限制:131072 kb 分值: 0 難度:基礎題

有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n及每堆石子的數量,問最後誰能贏得比賽。

例如:3堆石子,每堆1顆。a拿1顆,b拿1顆,此時還剩1堆,所以a可以拿到最後1顆石子。

input

第1行:乙個數n,表示有n堆石子。(1 <= n <= 1000) 第2 - n + 1行:n堆石子的數量。(1 <= a[i] <= 10^9)

output

如果a獲勝輸出a,如果b獲勝輸出b。

input示例

3 1 1 1

output示例

a【思路搬運 來自

這一次我們講的是乙個古老而又經典的博弈問題: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局面的轉移性質,所以該結論的正確性也得到了證明。

//**如下

#include

#include

#include

#include

using namespace std;

int a,n,p;

int main()

if(p==0) cout<<"b"

}

博弈 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 在此問基礎上新增乙個集合,集合內的數字是每次操作可取的石子個數,每次從一堆中取,最後無法取者判輸 對每堆石子算得...

Nim博弈遊戲

給定n堆石子,每次每人能從一堆石子中取若干個石子 不能不取 最後不能取石子者敗 對於這個遊戲,我們要判斷的是,給定局勢下,先手者勝還是敗 設先手勝的局勢為n postion,先手敗的局勢為p postion 可以移動到p postion的局勢叫做n postion,只能移動到n postion的局勢...