階梯博弈:
先借用別人的一幅。(1階梯之前還有乙個
0階梯未畫出)
階梯博弈的最初定義是這樣的:每乙個階梯只能向它的前乙個階梯移動本階梯的點,直至最後無法移動的為輸。
那麼,利用nim,只計算奇數級的異或和,當為
0時,先手必敗。(至於為什麼有這樣的,我也能說明白,但下文要討論的是怎麼做)。
假設這樣個nim
理解是對的。那麼,要怎麼移動呢?
首先(先手必勝情況下),先手必定移動奇數級的點到偶數級,使它的sg為0
。對於後手,若他移動奇數級的點到偶數,則此時
sg不為
0,先手只需移動其他奇數級的點,即可使
sg再為
0。若後手移動偶數級的點到奇數,則先手只需把同等的點從該奇數級移走即可。
這個就是最基本的階梯博弈。
poj 1704
我們把每個chess當前可以移動的步數設為階梯上的點,於是,把階梯級數編號。注意,這裡是從右往左編號,每次奇數級向前移動k步,則相當於把相應的點數移動到其右邊的偶數級上。對偶數級移動也相同。於是,就是普通階梯博弈了。
1 #include 2 #include 3 #include 4 #include 5view codeusing
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 }
博弈論(階梯博弈)POJ 1704
對階梯博弈的闡述 博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點 1 移到前面去,最後沒有點可以移動的人輸 證明方式 如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放 如何來分析這個問題呢 其實階梯博弈經過轉換可以變為n...
poj 1704 博弈 轉化為取石子
poj 問題描述 georigia和bob玩棋子的遊戲,棋子是排在同一行的,每人每次可以移動乙個棋子,移動的格數不限,但移動只能向左,且不能超過左邊的棋子。當誰沒有棋子可移時,誰就輸了。女士優先原則,georgia總是優先。解題思路 我們把棋子按位置公升序排列後,從後往前把他們兩兩繫結成一對。如果總...
階梯博弈(Stair Nim)
首先是對階梯博弈的闡述.博弈在一列階梯上進行.每個階梯上放著自然數個點.兩個人進行階梯博弈.每一步則是將乙個集體上的若干個點 1 移到前面去.最後沒有點可以移動的人輸.如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放.如何來分析這個問題呢.其實階梯博弈經過轉換可以變為nim...