初學博弈論

2021-09-20 12:56:52 字數 4870 閱讀 9631

只有一堆n個石子,兩個人輪流從這堆石子中取石子,規定每次至少取乙個,最多取m個,最後取完的人獲勝。

當n <= m的時候,顯然先手獲勝,因為一次就能取完。

當n = m+1 的時候,由於先手最多取走m個,無論其取走多少個,剩下的後手均可以一次取完,顯然後手勝。

根據以上分析,我們可以將n寫成n = (m+1) * r + s的形式。對於先手玩家,我們可以取走s個,給對方造成剩下(m+1) 整數倍的情形。此時無論對手取走多少個,假設對手取走k個, 我們一定可以做到取走 (m+1-k)個,此時剩下(m+1) * (r-1)個,那麼留給對方又是(m+1)的整數倍,如此就可以保證先手取勝。

當 n <=m 時,先手必勝。

當 n % (m+1) = 0時,後手必勝。

當 n % (m+1) != 0時,先手必勝。

其中上述的情況1和3可以合併,故:

當 n % (m+1) = 0時,後手必勝。

當 n % (m+1) != 0時,先手必勝。

變形玩法:兩個人輪流報數,每次至少1個數,最多報10個數字,誰先報到100取勝。

hdu 1846

hdu 2149

hdu 2188

hdu 4764

p點,即必敗點。前乙個選手(previous player)將取勝的位置稱為必敗點。

n點,即必勝點。下乙個選手(next player)將取勝的位置稱為必勝點。

所有終結點均為必敗點(p點);

從任何必勝點(n點)操作,至少有一種方法可以進入必敗點(p點);

無論如何操作,必敗點(p點)都只能進入必勝點(n點)。

將所有終結位置標記為必敗點(p點);

將所有一步能進入必敗點(p點)的位置標記為必勝點(n點);

如果從某個點開始的所有一步操作都只能進入必勝點(n點),則將該位置標記為必敗點(p點);

如果在步驟3中未能找到新的必敗點(p點),演算法終止,否則返回步驟2.

當行列都是奇數的時候,一定是必敗點;

否則為必勝點。

至於結論怎麼推出來的,大家畫一下3 * 4, 4 * 4, 3 * 3的pn分析圖就知道了。

hdu 2147

有一堆個數為n的石子,遊戲雙方輪流取石子,滿足:

先手不能再第一次把所有石子取完;

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

取最後石子的人為贏家。

先說結論:

當且僅當n不是fibonacci數時,先手必勝。換句話說,先手必敗構成fibonacci數列。

證明需要前置技能,「zeckendorf定理」(齊肯多夫定理),其表述為:任何正整數可以表示為若干個不連續的fibonacci數之和。

具體證明在這篇博文中給出,有興趣的讀者可以自行學習。

hdu 2516

有兩堆各若干個石子,兩個人輪流從某一堆或者兩堆中取同樣多的物品,規定每次至少取乙個,多著不限,最後取完石子的人獲勝。

設這兩堆石子分別有(a,b)個,並且a<=b。我們先來看一下先手必敗的局勢。

(0,0) 先手必敗,很明顯他沒得取了。

(1,2) 先手必敗。具體分析一下,先手有以下幾種取法:

取第一堆的1個,後手取走第二堆的2個獲勝。

從第一堆第二堆各取1個,後手取走第二堆剩下的1個獲勝。

取第二堆的1個,後手從第一堆第二堆各取1個獲勝。

取第二堆的2個,後手取走第一堆的1和獲勝。

綜上所述,先手必敗。(3,5) 先手必敗。 首先可以明確的一點是,先手不能把任意一堆取完,如果取完顯然必敗。

先討論先手從第一堆中取的情況

先手可以從第一堆中取1個,後手從第二堆中取4個,轉化為(1,2),先手必敗。

先手可以從第一堆中取2個,後手從第二堆中取3個,轉化為(1,2),先手必敗。

再討論先手從第二堆中取的情況

先手可以從第二堆中取1個,後手從兩堆中各取2個,轉化為(1,2),先手必敗。

先手可以從第二堆中取2個,後手從兩堆中各取3個,轉化為(0,0),先手必敗。

先手可以從第二堆中取3個,後手從兩堆中各取1個,轉化為(1,2),先手必敗。

先手可以從第二堆中取4個,後手從第一堆中取2個,轉化為(1,2),先手必敗。

接著討論先手從兩堆中取的情況

先手可以從兩堆中各取1個,轉化為(2,4),此時情況較多

後手足夠聰明,他從第二堆中取了1個,轉化為(2,3),先手也足夠聰明,他為了不直接輸掉,從第一堆中取了1個(其他取法直接輸掉了),轉化為(1,3),此時後手從第二堆中取1個,轉化為(1,2),先手必敗。

先手可以從兩堆中各取2個,後手從第二堆中取乙個,轉化為(1,2),先手必敗。

綜上所述,先手必敗。其他的先手必敗局勢

(4,7),(6,10),(8,13),(9,15),(11,18).

我們將先手必敗局勢的集合,稱為奇異局勢。

任何自然數都包含在乙個且僅有乙個奇異局勢中。

任意操作都可將奇異局勢變為非奇異局勢。

採用適當的方法,可以將非奇異局勢變為奇異局勢。

我們可以發現,將所有奇異局勢按照第一堆的石子的數目從小到大排列,每個奇異局勢的差值是自然數列

進一步觀察發現,對於乙個奇異局勢(a,b), a = 下取整[ (b-a) * 1.618 ],更準確的說,1.618 = (sqrt(5) + 1) / 2.

給出乙個局面,判斷先手輸贏。

檢查是否是奇異局勢。

給出局面,判斷先手輸贏,若贏,求出首步取法。

由於差值是固定的,根據差值計算。

poj 1067

hdu 1527

51nod 1072

hdu 2177

nyoj 161

有三堆石子, 每堆有若干個,兩個人輪流從某一堆中任取石子,每次至少取乙個,多者不限,最後取完者獲勝。

用(a,b,c)來表示某一特定局勢,同時規定a<=b<=c。奇異局勢表示先手必敗。

顯然(0,0,0)是奇異局勢。

(0,n,n)是奇異局勢,當先手拿走s個石子時,我們對應拿走s個石子,最終轉化為(0,0,0)。

(1,2,3)也是奇異局勢,無論先手如何取,我們都可以轉化為(0,n,n)的局勢。

對於乙個奇異局勢(a,b,c),我們可以發現,a(xor)b(xor)c = 0。

下面一條需要的前置技能

設有數字a,b,a(xor)b(xor)(a(xor)b) = (a(xor)a)(xor)(b(xor)b) = 0

對於乙個非奇異局勢(a,b,c),我們只需要將c轉化為(a(xor)b)即可,而將c轉化為(a(xor)b)的操作為,c = c-(a(xor)b)即可。

注:異或在c語言中的符號為^。

對於此情景來說,可以推廣到n堆石子,奇異局勢的條件為a1(xor)a2(xor)a3(xor)……an(xor) = 0。

a(xor)b(xor)b = a,可推廣到n個變數,a1(xor)a2(xor)a3(xor)……(xor)an(xor)an(xor)an-1(xor)……(xor)a3(xor)a2 = a1;

hdu 1850

sg函式為計算博弈狀態的函式,當sg[x] = 0時,說明先手必敗。

為了求解sg函式,首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。

對於任意狀態 x , 定義 sg(x) = mex(s),其中 s 是 x 後繼狀態的sg函式值的集合。如 x 有三個後繼狀態分別為 sg(a),sg(b),sg(c),那麼sg(x) = mex。

這樣 集合s 的終態必然是空集,所以sg函式的終態為 sg(x) = 0,當且僅當 x 為必敗點p時。

說起來很抽象,舉乙個具體的例子來說明一下。

遊戲規則:

有1堆n個的石子,每次只能取個石子,先取完石子者勝利,那麼各個數的sg值為多少?

sg分析

sg[0] = 0(顯然沒有石子可取時必敗);

f = (表示每次取有3中方案,取1個,取3個,取4個);

當石子x = 1時,可以取走1-f個石子,sg[1] = mex(sg[1-1]) = mex(0) = 1;

當石子x = 2時,可以取走2-f個石子,sg[2] = mex(sg[2-1]) = mex(1) = 0;

當石子x = 3時,可以取走3-f個石子,sg[3] = mex(sg[3-1],sg[3-3]) = mex(0,0) = 1;

當石子x = 4時,可以取走4-f個石子,sg[4] = mex(sg[4-1],sg[4-3],sg[4-4]) = mex(1,1,0) = 2;

以此類推…

我們可以打出sg函式的表,根據表來判斷是先手必勝還是先手必敗。

hdu 1847

hdu 1848

poj 2234

hdu 4388

poj 2975

hdu 1367

poj 2505

zoj 3057

poj 2484

poj 2425

poj 2960

poj 1740

poj 1704

poj 2068

poj 3480

poj 2348

hdu 2645

poj 3710

poj 3533

模板 數學 博弈論

1.要從必勝或必敗的局面反推 2.sg函式 只要當前狀態可以轉移到的狀態中有乙個是敗態,那麼當前狀態就是勝態。勝態為n。如果當前狀態可以轉移到的所有狀態都是勝態,那麼當前狀態就是敗態。敗態為p。sg函式為每個狀態賦乙個自然數的值,這個值為除這個狀態的後繼外的最小自然數。首先定義mex minimal...

模板 數學 博弈論 SG函式

f i 表示狀態i的後繼狀態,把它的後繼狀態push back 進去,然後呼叫getsg 就可以得到sg函式。無法轉移的狀態都是失敗狀態,這種寫法貌似只能向標號更小的狀態轉移 本身這個圖就是dag,就有拓撲序,所以本質上無所謂,更何況取石子非常直觀 所以一般f 0 就是失敗狀態。當然也可能會有別的失...

博弈論 Nim博弈

1.nim博弈的起源很早,至於歷史我們就不再說了,直接說它的使用場景。1 依舊是兩個人博弈,但是物品時n堆,每一堆有ai個。2 每個人可以挑選一堆取走若干個,但是不能不取。3 最先取完所有物品的人獲勝。4 結論 所以堆的物品的數量異或起來是0,先手必敗。2.乙個nim博弈的例項 nim博弈。乍一看這...