階梯博弈 學習筆記

2021-08-03 17:49:26 字數 2220 閱讀 2333

今天剛做了一道題。

poj 1704

題目大意

georgia and bob在玩遊戲(求alice心理陰影面積),在乙個1行的格仔上,有n個棋子,兩人輪流操作,georgia永遠先手,每次操作需要將乙個棋子向左移動,至少要移動乙個格仔,但不可以移到左邊緣,或者越過其他的格仔,無法操作的人輸,問對於給出的狀態是否有必勝策略。

一開始還以為是針對於每個棋子最終能移動到**,將這之間需要的總移動數看做石子堆的數量,但這樣做真的錯的很離譜。因為棋子的位置對後繼狀態產生影響,所以不能這樣做。

對於這類題目,從簡單的情況入手:

n=1不解釋。

n=2,如果這兩個棋子靠攏在一起,那麼不難推出,先手必敗,因為先手只能移前面的棋子,而後手只需將後面的棋子移到前面,使兩枚棋子靠攏,最後先手必敗,反之,先手就會讓後面的棋子移到前面靠攏,從而保證自己必勝。

n=3,應該也是靠攏的原則,就是一開始應該2向1靠攏,還是3向2靠攏?其實很難想。

還是直接給出來,這道題其實是和奇偶有關的博弈,nim遊戲的高階版,稱為階梯博弈。

階梯博弈的模型如下:

給出n個台階,每個台階上有ai個石子,把地面當做台階0,雙方輪流操作,每次將乙個台階上,至少選1個,最多全取,的石子取出,並放在左邊乙個台階上,沒有操作策略的人輸(此時所有石子都在地面上),問先手是否有必勝策略。

沒錯,這圖網上copy來的,不過網上大多數將這個的都是互相轉(chao)載(xi),錯誤也一併co下來了。

給出階梯博弈先手必勝的條件:

當且僅當所有奇數上的台階的石子數的異或和不為0時,先手必勝。

下面給出(並不嚴謹的)證明:

在模型中已經說明,把地面看做台階0,那麼在偶數台階上的石子是可以自動忽略的,因為即使把後手把偶數台階上的石子移到奇數台階上,我們依舊可以把剛移過來的石子再原封不動往下再移一次,這麼挪來挪去,這些石子就會移到地面上,然後,這些石子就沒意義了,哪怕後手中途放棄這些石子去操作,如果還是去操作偶數台階上的,前面已經有講過,如果操作奇數上的,那我們就認真玩,因為我們已經知道所有奇數台階上石子的異或和不為0,那就可以保證,當我們某一次操作之後,後手就會發現只有一些偶數台階上有石子了,然後我們跟著後手的步驟,然後就磨死他了。

或者這麼說。我們按照尼姆博弈的原則進行第一次移動。如果對方移動奇數號階梯的石子,我們繼續按照尼姆博弈的原則移動。如果對方移動的是偶數號階梯的石子,及對方將偶數號階梯的石子移動到了奇數號(對奇數號產生了影響),我們就接著將對方移動到奇數號的石子再向下移動乙個台階,移動到偶數號。這就意味著在偶數號的棋子對我們的博弈是沒有影響的(這段話是copy來的,我怕自己說話說不清楚,這篇文章講的挺好,畢竟很少有正確的關於階梯博弈的文章,有些疑問可以看它)。

好吧,回到poj 1704,現在就是把問題轉化為模型上來。首先就是靠攏,很明顯奇數棋子和偶數棋子之間的空隙大小是與石子數等價的,但是當n為奇數時,因為我們說了是奇數,所以第乙個棋子可以理解為在0的位置有乙個編號為0的棋子,而1棋子就向它靠攏。那麼這道題就可以轉化成nim博弈了。

#include

#include

using

namespace

std;

int tst,n,ans,a[10005];

inline

void readi(int &x)

}int main()

return

0;}

更新於 2023年10月8日19:51:20

有許可權的雙倍經驗題 bzoj 1115 orz lynstery

有n堆石子,除了第一堆外,每堆石子個數都不少於前一堆的石子個數。兩人輪流操作每次操作可以從一堆石子中移走任意多石子,但是要保證操作後仍然滿足初始時的條件誰沒有石子可移時輸掉遊戲。問先手是否必勝。

考慮相鄰石子的差值,當取第i堆石頭時,i與i-1的差值的減小量等於i+1與i的差值的增加量,且要時刻保證差值非負。 這樣就轉換成階梯博弈模型了。

#include

#include

using

namespace

std;

int tst,n,ans,a[10005];

inline

void readi(int &x)

}int main()

return

0;}

階梯博弈(Stair Nim)

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

階梯博弈(Staircase Nim)

階梯博弈!下面闡述一下我對於階梯博弈的理解.首先是對階梯博弈的闡述.博弈在一列階梯上進行.每個階梯上放著自然數個點.兩個人進行階梯博弈.每一步則是將乙個集體上的若干個點 1 移到前面去.最後沒有點可以移動的人輸.如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放.如何來分析這...

趣味博弈論 階梯博弈

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