常見組合博弈遊戲

2021-07-25 14:39:20 字數 2998 閱讀 3977

這兩天認識了幾個組合遊戲的基礎模型,希望自己能更新下去。。

有兩個盒子,乙個裝有 m 顆糖,乙個裝有 n 顆糖,表示為 (m, n) .

每次清空乙個盒子,將另乙個盒子裡的糖轉移一些過來,並保證兩個盒子至少各有一顆糖。

最後進行轉移糖者勝,無法轉移糖者敗。

m, n 都為奇數,先手敗;m, n 至少乙個為偶數,先手勝。

顯然,初始狀態為(1, 1),先手必敗;

故對於任意 (m, n) 結論成立。

有乙個 m * n 的棋盤,棋盤的每乙個格仔用(x, y)表示,最左下角是(1, 1),最右上角是(m, n) ;

每次可以拿走乙個方格,並拿走該方格右邊與上邊的所有方格。

誰拿到(1, 1)誰敗。

當 m = n = 1,先手敗;除此之外,先手均有必勝策略(先手勝)。

反證法:

假設後手能取得勝利,那麼先手可以第一步拿走(m, n),若後續回合內後手通過拿走(x, y)達到了必勝狀態,先手均可以第一步就拿走(x, y)來達到必勝狀態。 

故不存在後手必勝狀態。

由於無法給出構造性證明,所以只能證明先手必勝,而不能給出廣義的必勝策略。

桌上有 n 個數字:1~n。

兩人輪流在選擇乙個桌上的數 x ,然後將 x 與 x 的約數都拿走。

拿去最後乙個數的人勝出(無法選擇數字的人失敗)。

先手有必勝策略。(先手勝)

這個遊戲是 chomp! 的思想的應用。

假設後手能取得勝利,那麼先手可以第一步拿走 1,若後續回合內後手通過拿走 x 達到了必勝狀態,先手均可以第一步就拿走 x 來達到必勝狀態。

n 個物品堆成一堆。

兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取 m 個。

最後取光者得勝。(無法取者敗)

如果 n%(

m+1)

≠0,則先手必勝。

有乙個遊戲,在乙個n*m的矩陣中起始位置是(1, m),走到終止位置(n, 1);遊戲規則是只能向左,下,左下方向移動一步,先走到終點的為獲勝者。(hdu 2147,總共有 n + m 的距離要移動,一次最多移動 2 的距離,故判斷 (n + m)%2 是否為 0 即可)。

bash博弈變形1——減法博弈: 

兩個人輪流報數,每次至少報乙個,最多報十個,誰能報到100者勝。(先手必勝,第一次報1,類似:hdu 2149) 

有乙個由n個石子組成的石子堆,兩名玩家輪流從中拿走石子,每次拿走石子的個數只能是集合s中的數。拿走最後一枚石子的玩家獲勝。(狀態轉移即可)

bash博弈變形2:初始狀態下有石子n個,除最後一次外其他每次取物品個數必須在[p,q]之間,最後一次取硬幣的人輸。(hdu 2897) 

這題狀態稍微複雜一些,並且勝負條件與之前相反,一般bash博弈裡每次取個數可以看作在[1,m]之間,勝負手判斷為 n%

(1+m

) ,因此我們可以猜想每次取[p,q]的勝負手判斷為 n%

(p+q

) ,通過驗證猜想我們可以發現如下策略:

//hdu 2897

#include

using

namespace

std;

int main()

return

0;}

有兩堆石子,一堆有 m 個,另一堆有 n 個。

雙方輪流取走一些石子,合法的取法有如下兩種: 

1. 在一堆石子中取走任意多顆; 

2. 在兩堆石子中取走相同多的任意顆.

取走最後一顆石子的人為贏家。

(1,2)

與 (2,1)

視為同一狀態, 

第 k 個必敗狀態是 (\lfloor\frac*k \rfloor+k,\lfloor\frac*k \rfloor)

//hdu 1527 模板題

#include

using

namespace

std;

int main()

return

0;}

還是打表吧。。

const

int n = 50 ;

bool win[100][100] ;

void init() }}

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

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

}

有一堆個數為 n >= 2 的石子。

雙方輪流取石子,滿足以下條件: 

1. 先手不能在第一次把所有的石子取完; 

2. 之後每次可以取的石子數介於 1 到對手剛取的石子數的 2 倍之間(包含 1 和對手剛取的石子數的 2 倍)。

取走最後乙個石子的人為贏家。

如果 n 是斐波那契數,則後手勝;反之,先手勝。

\\hdu 2516 模板題

#include

using

namespace

std;

const

string win[2] = ;

long

long fib[100] ;

int init()

return

100 ;

}int main()

}cout

<< win[ok] << endl ;

}return

0;}

zeckendorf定理:任何正整數可以表示為若干個不連續的 fibonacci 數之和。

先手必須從 <= n / 3 的數量開始取(例如第一次取的數量 > n/3,那麼後手可以直接取完所有剩下石子) 

於是。。。太繞了!

還是請看acdream大神的吧。。

有三堆各若干個物品,兩個人輪流從某一堆取任意多的 

物品,規定每次至少取乙個,多者不限,最後取光者得勝。

介紹這個遊戲的太多了。。偷個懶 

具體解法就是異或異或!

組合遊戲(博弈)

昨天看大白書翻到了組合遊戲這章,看著發覺原來是博弈論的內容,於是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不過好在還是集中精神地看了大部分。從nim遊戲 n堆石子,每人每次可以從任意一堆中取至少1個 至多整堆的石子,不能取者為輸 開始講起,引入必勝態 必敗態的概念 1.乙個狀態是必敗狀...

組合遊戲(博弈)

昨天看大白書翻到了組合遊戲這章,看著發覺原來是博弈論的內容,於是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不過好在還是集中精神地看了大部分。從nim遊戲 n堆石子,每人每次可以從任意一堆中取至少1個 至多整堆的石子,不能取者為輸 開始講起,引入必勝態 必敗態的概念 1.乙個狀態是必敗狀...

博弈 ICE公平組合遊戲(簡單整理結論)

1.由兩名玩家組成。2.遊戲的狀態為有限的。3.兩人輪流走,當有一玩家不可繼續時遊戲結束。1.問題 一堆n個物品,兩人輪流取 1 m個 取光者勝。2.同餘定理 n k m 1 r,先手取走r個,無論後手取走多少個,只要先手取的數目和為 m 1 則先手必贏。分析 1 n m時,先手必贏。2 n m 1...