階梯博弈 POJ 1704

2022-05-11 20:39:42 字數 1154 閱讀 1144

階梯博弈:

先借用別人的一幅。(1階梯之前還有乙個

0階梯未畫出)

階梯博弈的最初定義是這樣的:每乙個階梯只能向它的前乙個階梯移動本階梯的點,直至最後無法移動的為輸。

那麼,利用nim,只計算奇數級的異或和,當為

0時,先手必敗。(至於為什麼有這樣的,我也能說明白,但下文要討論的是怎麼做)。

假設這樣個nim

理解是對的。那麼,要怎麼移動呢?

首先(先手必勝情況下),先手必定移動奇數級的點到偶數級,使它的sg為0

。對於後手,若他移動奇數級的點到偶數,則此時

sg不為

0,先手只需移動其他奇數級的點,即可使

sg再為

0。若後手移動偶數級的點到奇數,則先手只需把同等的點從該奇數級移走即可。

這個就是最基本的階梯博弈。

poj 1704

我們把每個chess當前可以移動的步數設為階梯上的點,於是,把階梯級數編號。注意,這裡是從右往左編號,每次奇數級向前移動k步,則相當於把相應的點數移動到其右邊的偶數級上。對偶數級移動也相同。於是,就是普通階梯博弈了。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;67

intn;

8int p[1010];9

int stair[1010

];10

11int

main()

21 sort(p,p+n+1

);22

for(int i=1;i<=n;i++)

23 stair[i]=p[i]-p[i-1]-1;24

int sum=0; int cnt=0;25

for(int i=n;i>=1;i--)

30if(sum) printf("

georgia will win\n");

31else printf("

bob will win\n");

32}33return0;

34 }

view code

博弈論(階梯博弈)POJ 1704

對階梯博弈的闡述 博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點 1 移到前面去,最後沒有點可以移動的人輸 證明方式 如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放 如何來分析這個問題呢 其實階梯博弈經過轉換可以變為n...

poj 1704 博弈 轉化為取石子

poj 問題描述 georigia和bob玩棋子的遊戲,棋子是排在同一行的,每人每次可以移動乙個棋子,移動的格數不限,但移動只能向左,且不能超過左邊的棋子。當誰沒有棋子可移時,誰就輸了。女士優先原則,georgia總是優先。解題思路 我們把棋子按位置公升序排列後,從後往前把他們兩兩繫結成一對。如果總...

階梯博弈(Stair Nim)

首先是對階梯博弈的闡述.博弈在一列階梯上進行.每個階梯上放著自然數個點.兩個人進行階梯博弈.每一步則是將乙個集體上的若干個點 1 移到前面去.最後沒有點可以移動的人輸.如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放.如何來分析這個問題呢.其實階梯博弈經過轉換可以變為nim...