博弈sg函式

2021-07-10 08:20:45 字數 1707 閱讀 4584

sg函式(個人認為還是用於三種方法都無法解決的情況,如按特殊數字取石子)

我們把整個博弈過程抽象為有向無環圖

1.      幾項準備工作:

mex求最小非負整數mex{} = 0,mex = 3,mex = 0

sg[x] =mex//就是石頭變少的繼

這樣sg就滿足幾個性質

1.      sg[x] == 0時,它的後繼都不為零

2.      sg[x] != 0時,它的後繼一定有為零的

3.      當x點沒有出邊時,sg[x] == 0

這三個性質恰好與p-positon(先手必敗)的性質相同:

(1).無法進行任何移動的局面(也就是terminal position)是p-position;

(2).可以移動到p-position的局面是n-position;

(3).所有移動都導致n-position的局面是p-position。

由此可知:sg[x] == 0,x就是p-position 2.

對於從一堆n個石塊中取石塊的過程,每次取法有一定特色(比如說按照菲薄納切數列來去)只需求出sg[x]就可以判斷了

對於從m堆石塊中取石塊的過程,每次取法是特殊的。只需將所有s[n]亦或就是結果

讓我們再來考慮一下頂點的sg值的意義。當g(x)=k時,表明對於任意乙個0<=i,都存在

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枚棋子的必勝策略!

假設一堆石塊有n個石塊這就意味著sg[n]確實等價為從n個石塊中每次至少取乙個石頭

4.模板.注意要根據題目的要求初始化a[i]。切記初始化sg都為-1,init中的a一定是從小到大的

1.dfs遞迴版。從n個石頭開始遞迴

呼叫方式:sg(n)

const int maxn=1005;

int a[maxn],sg[maxn];

void init()

{ a[1] = 1,a[2] = 2;

for(int i = 3; i < 20; i ++)

{a[i] = a[i - 1] + a[i - 2];

// cout<

2.      打表法

呼叫方法:sg[n]

const int maxn=1005;

int a[maxn],sg[maxn],b[maxn];

int n,maxx;//maxx表示sg表的大小。n表示的是a的大小,也就是每一步所能走的值的集合的大小

void init()

{ a[1] = 1,a[2] = 2;

for(int i = 3; i < 20; i ++)

{a[i] = a[i - 1] + a[i - 2];

// cout<

博弈SG函式

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

SG函式博弈函式

必勝點和必敗點的概念 p點 必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。n點 必勝點,處於此情況下,雙方操作均正確的情況下必勝。必勝點和必敗點的性質 1 所有終結點是 必敗點 p 我們以此為基本前提進行推理,換句話說,我們以此為假設 2 從任何必勝點n 操作,至少有一種方式可以...

博弈 SG函式和SG定理

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