sg函式 和 博弈

2021-07-24 14:09:40 字數 3666 閱讀 2632

這幾天一直在看博弈,一直想寫部落格,但又一直沒寫,感覺自己沒有搞懂sg函式,幾種簡單的博弈似乎是看懂了。。。但是sg函式到現在我還是在用著,但是我有些疑惑並不懂。

首先先貼一下幾個部落格,

第一就是kuangbin菊苣的部落格了:

這是他轉的:

這是他的一些題目:

這個上面的題我都刷了一遍,感覺是難度有點低

首先保證至少第乙個鏈結裡面的東西必須要完全理解才算入門吧

hdu

1846 : 簡單的bash博弈,簡單做

2147:

乙個棋子在右上角,先要將其移到左下角,可以向左、下、左下方移動,依次博弈,可以發現也是乙個bash博弈,時間複雜度夠掃一遍,即可。

2188:同理bash博弈

2149:

bash博弈,不過比最簡單的稍微複雜了一丟丟

1847 :

bash博弈的變形,把能取牌的方式變成了2的冪次。2的指數增長很快,所以我們打表然後掃一下就好了

1850:

nim博弈,求有多少種取法:

首先異或和不為0才能贏, 然後我們遍歷一下所有的堆:(其他堆異或和= sum^這一堆的數量) 我們在每一堆中取完後異或和都必須為0。所以統計一下每一堆是否可取就可以了。

**1848 :

nim博弈變形,能取的石頭數量變成了斐波那契數,我們把每一堆的sg函式跑出來,然後異或起來就可以了,至於為什麼可以這樣,我們在下面的sg函式解釋

1849 :

nim 博弈變形,我們只需要把每一顆棋子看成一堆石子,然後剩下的聰明的你應該就會了吧。

1517:

p=1,每次可以*2~9 , 先把p乘到》=n的人就贏了。這個問題由於n每次給的都不一樣,所以我們並不是很好預處理,不妨每次dfs 一遍即可,2的指數增長是很快的。

sg[i]!=0 的條件是 在 j=i*2~*9裡面必須有乙個sg[j]=0,否則sg[i]=1.

* 如果我們轉換一下

* 有一堆石子 n 個

* 每次只能取 上一次取得石子的2~9 倍, 如果石子不夠就全部取走

* 取走最後一顆石子的玩家算贏

* 相當於 bash博弈

1536

nim博弈變形,其實和1848是一樣的

題意:

先輸入k,代表集合s中有k個數,然後輸入k個數。

有m輪迴合,每一輪回合先輸入m表示有m堆石子,然後每一堆石子有多少個石子數,然後取法只能取s中的數字

但是這裡有乙個要注意的地方

在用來mex的函式(比如用flag),一定要設定成bool,這樣能夠讓時間快上很多很多。用int可能會t

總結一下,兩個要點:

1.當時間空間不夠的時候不妨打表找找規律

2.bool 型別 就是比int 不知道快到**去了

給定乙個有向無環圖和乙個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進行移動,無法移 動者判負。事實上,這個遊戲可以認為是所有impartial combinatorial games的抽象模型。 即icg問題

也就是說,任何乙個icg都可以通過把每個局面看成乙個頂點,對每個局面和它的子局面連一條有向邊來抽象成這個「有向圖遊戲」。下 面我們就在有向無環圖的頂點上定義sprague-grundy函式。

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

這一部分,我到現在也沒完全理解為什麼要這麼做!,先繼續看 可以跳過我的猜想,先說下我的猜想:猜想是把這種狀態看成一堆石子,sg[i]只是代表i這堆石子有sg[i]個石頭,因為剩下的0<=j< i 的石頭數我們都能夠取到,正好符合下面所說的理念,也符合nim博弈

對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague-grundy函式sg如下:sg(x)=mex。

來看一下sg函式的性質。

1.首先,所有的terminal position所對應的頂點,也就是沒有出邊的頂點,其sg值為0,因為它的後繼集合是空集。

2.然後對於乙個g(x)=0的頂點x,它的所有前驅y都滿足 g(y)!=0。

3.對於乙個g(x)!=0的頂點,必定存在乙個後繼y滿足g(y)=0。

以上這三句話表明,頂點x所代表的postion是p-position當且僅當sg(x)=0(跟p-positioin/n-position的 定義的那三句話是完全對應的)也就是說我們可以根據來sg函式的值來判斷勝負手

我們通過計算有向無環圖的每個頂點的sg值,就可以對每種局面找到必勝策略了。但sg函式的用途遠沒有這樣簡單。如果將有 向圖遊戲變複雜一點,比如說,有向圖上並不是只有一枚棋子,而是有n枚棋子,每次可以任選一顆進行移動,這時,怎樣找到必勝策略呢?

讓我們再來考慮一下頂點的sg值的意義。當g(x)=k時,表明對於任意乙個0<=i< k,都存在x的乙個後繼y滿足g(y)=i。也 就是說,當某枚棋子的sg值是k時,我們可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。不知道你能不能根據這個聯想到nim遊戲, nim遊戲的規則就是:每次選擇一堆數量為k的石子,可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。這表明,如果將n枚棋子所在的頂 點的sg值看作n堆相應數量的石子,那麼這個nim遊戲的每個必勝策略都對應於原來這n枚棋子的必勝策略!

這段話很重要,耐心多看幾遍!有不理解的地方再讀幾遍,這些肯定都是對的。

其實我們還是只要證明這種多棋子的有向圖遊戲的局面是p-position當且僅當所有棋子所在的位置的sg函式的異或為0。這個證明與上節的bouton』s theorem幾乎是完全相同的,只需要適當的改幾個名詞就行了。

剛才,我為了使問題看上去更容易一些,認為n枚棋子是在乙個有向圖上移動。但如果不是在乙個有向圖上,而是每個棋子在乙個有向圖上,每次可以任選乙個棋子(也就是任選乙個有向圖)進行移動,這樣也不會給結論帶來任何變化。

如此一來就可以解釋 上面的兩道題,也可以解釋為什麼sg函式可以喝nim博弈相互動著使用。

bomb game

sg函式的博弈。。。說有乙個n,m大小的棋盤,每個炸彈引爆之後可以往左邊和上方 **兩個炸彈,除非它位於最左方或者最上方就不能夠**。。。 當兩個炸彈位於同乙個位置時,他們會**,不**。 或者(1,1)這個位置永遠不會存在炸彈。。。 john先手,問輸贏關係。

所以我們可以知道mp[0][0]這一點的sg值肯定是0;

然後第一行和第一列的sg值都是i(j),可以看成一堆石子任意取。

然後對於矩形中的 mp[i][j],這個石子的sg怎麼求呢? 首先他左邊和上方的所有點sg值都必須已知,如果把它看成一堆石子,他可以分成的兩個炸彈就相當於很多後繼,我們就找到mex即相當於這一堆石子的數量,然後我們把所有炸彈(即一共的石子堆按nim博弈異或起來即可)

int getsg(int a,int b)  

for(i=0;;i++)

}

博弈 SG函式和SG定理

在介紹sg函式和sg定理之前我們先介紹介紹必勝點與必敗點吧.必勝點和必敗點的概念 p點 必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。n點 必勝點,處於此情況下,雙方操作均正確的情況下必勝。必勝點和必敗點的性質 1 所有終結點是 必敗點 p 我們以此為基本前提進行推理,換句話說,...

博弈sg函式

sg函式 個人認為還是用於三種方法都無法解決的情況,如按特殊數字取石子 我們把整個博弈過程抽象為有向無環圖 1.幾項準備工作 mex求最小非負整數mex 0,mex 3,mex 0 sg x mex 就是石頭變少的繼 這樣sg就滿足幾個性質 1.sg x 0時,它的後繼都不為零 2.sg x 0時,...

博弈SG函式

題意 乙個棋盤有n行,每行20格仔,都有一些棋子,兩個人輪流進行這個操作 選擇某一行乙個棋子移動到該行右邊第乙個空的格仔。不能進行的人輸。問先手是否能贏。分析 sg函式的應用,當時自己做的時候沒做出來qaq。終結點是這一行沒有棋子可以走,即0,然後逆推出其他結點的sg函式。每一行的狀態看成是乙個結點...