博弈論(階梯博弈)POJ 1704

2021-08-05 18:38:24 字數 1241 閱讀 4950

對階梯博弈的闡述:博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點( >=1 )移到前面去,最後沒有點可以移動的人輸

證明方式:如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 … 只能把後面的點往前面放…如何來分析這個問題呢…其實階梯博弈經過轉換可以變為nim..把所有奇數階梯看成n堆石子..做nim..把石子從奇數堆移動到偶數堆可以理解為拿走石子..就相當於幾個奇數堆的石子在做nim..( 如所給樣例..2^3^4=5 不為零所以先手必敗)為什麼可以這樣來轉化?

假設我們是先手…所給的階梯石子狀態的奇數堆做nim先手能必勝…我就按照能贏的步驟將奇數堆的石子移動到偶數堆…如果對手也是移動奇數堆..我們繼續移動奇數堆..如果對手將偶數堆的石子移動到了奇數堆..那麼我們緊接著將對手所移動的這麼多石子從那個奇數堆移動到下面的偶數堆…兩次操作後…相當於偶數堆的石子向下移動了幾個..而奇數堆依然是原來的樣子…即為必勝的狀態…就算後手一直在移動偶數堆的石子到奇數堆..我們就一直跟著他將石子繼續往下移..保持奇數堆不變…如此做下去..我可以跟著後手把偶數堆的石子移動到0..然後你就不能移動這些石子了…所以整個過程..將偶數堆移動到奇數堆不會影響奇數堆做nim博弈的過程..整個過程可以抽象為奇數堆的nim博弈…

其他的情況…先手必輸的…類似推理…只要判斷奇數堆做nim博弈的情況即可…

為什麼是只對奇數堆做nim就可以…而不是偶數堆呢?…因為如果是對偶數堆做nim…對手移動奇數堆的石子到偶數堆..我們跟著移動這些石子到下乙個奇數堆…那麼最後是對手把這些石子移動到了0..我們不能繼續跟著移動…就只能去破壞原有的nim而導致勝負關係的不確定…所以只要對奇數堆做nim判斷即可知道勝負情況…

即:是否為必勝態只需要根據當前從第乙個台階開始的編號為奇數的台階上石子的數量取異或即可。若異或值為0則先手必敗

模型變種 poj 1704

#include

#include

using

namespace

std;

int t;

int n;

int stairs[1010];

int ans ;

int main()

// coutputs("georgia will win");

else

puts("bob will win");

}//system("pause");

return

0;}

階梯博弈 POJ 1704

階梯博弈 先借用別人的一幅。1階梯之前還有乙個 0階梯未畫出 階梯博弈的最初定義是這樣的 每乙個階梯只能向它的前乙個階梯移動本階梯的點,直至最後無法移動的為輸。那麼,利用nim,只計算奇數級的異或和,當為 0時,先手必敗。至於為什麼有這樣的,我也能說明白,但下文要討論的是怎麼做 假設這樣個nim 理...

趣味博弈論 階梯博弈

階梯博弈是一種nim遊戲的變類,它的主要思想是對奇數階梯進行nim遊戲.什麼是階梯博弈?就是給你乙個階梯,這個階梯每一級上有一堆石子,你可以每次選擇某一級,將這一級上的一些石子推到下一級.當第一級的石子被推下就到了地上.現在兩個人輪流取石子.當某個人取時,剛好階梯上沒有石子,這個人就輸了.其實就是對...

poj 1704 博弈 轉化為取石子

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