題意:一維格仔上有若干棋子,每個格仔中最多只能放置一枚棋子。一次行動為向左移動一顆棋子,移動的步數隨意,但是棋子不能越過它左邊的棋子。兩人博弈,每人一動,最後不能移動者為負。
思路:將棋子視為兩兩一對。如果有奇數個棋子,就不考慮最前面的乙個。 在每對棋子中,如果對方移動前乙個,我方對後乙個移動相同的步數,使得對與對之間的距離可以不作考慮。只需考慮每對棋子之間的距離,這即歸結為nim取子遊戲:將每對棋子之間的距離視作一堆石子的個數,使得移動每對棋子的後乙個,相當於減少了某堆石子的數量。
#include #include int cmp(const int *a,const int* b)
int n,t;
int s[1005];
int main(){
freopen("a.txt","r",stdin);
scanf("%d",&t);
while(t--){
int i,res=0;
scanf("%d",&n);
for(i = 0;i
poj 1704 博弈 轉化為取石子
poj 問題描述 georigia和bob玩棋子的遊戲,棋子是排在同一行的,每人每次可以移動乙個棋子,移動的格數不限,但移動只能向左,且不能超過左邊的棋子。當誰沒有棋子可移時,誰就輸了。女士優先原則,georgia總是優先。解題思路 我們把棋子按位置公升序排列後,從後往前把他們兩兩繫結成一對。如果總...
階梯博弈 POJ 1704
階梯博弈 先借用別人的一幅。1階梯之前還有乙個 0階梯未畫出 階梯博弈的最初定義是這樣的 每乙個階梯只能向它的前乙個階梯移動本階梯的點,直至最後無法移動的為輸。那麼,利用nim,只計算奇數級的異或和,當為 0時,先手必敗。至於為什麼有這樣的,我也能說明白,但下文要討論的是怎麼做 假設這樣個nim 理...
博弈論(階梯博弈)POJ 1704
對階梯博弈的闡述 博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點 1 移到前面去,最後沒有點可以移動的人輸 證明方式 如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放 如何來分析這個問題呢 其實階梯博弈經過轉換可以變為n...