SG函式入門

2021-08-28 22:30:57 字數 2335 閱讀 1577

參考部落格:

首先定義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時。

sg函式的性質:

首先,所有的terminal position(目標位置)所對應的頂點,也就是沒有出邊的頂點,其sg值為0,因為它的後繼集合是空集。然後對於乙個g(x)=0的頂點x,它的所有前驅y

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

滿足g(y)=0。

sg值的意義:

1,當g(x)=k時,表明對於任意乙個0<=i

<

k,都存在x的乙個後繼y滿足g(y)=i。為什麼一定存在呢?

因為mex函式運算時,g(y)等於最小的不屬於(y後繼狀態)這個集合的非負整數,換言之,y的後繼狀態一定有

[0,k-1]

這個範圍,才會出現g(x)=k,k為不小於後繼狀態(集合),因為函式g就是按照mex運算得來的。

2,當某枚棋子的sg值是k時,我們可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。這個聯想到nim遊戲, nim遊戲的規則就是:每次選擇一堆數量為k的石子,可以把它變成0、變成1、……、變成k-1,但絕對不能保持k不變。這表明,如果將n枚棋子所在的頂 點的sg值看作n堆相應數量的石子,那麼這個nim遊戲的每個必勝策略都對應於原來這n枚棋子的必勝策略!

3,對於n個棋子,設它們對應的頂點的sg值分別為(a1,a2,…,an),再設局面(a1,a2,…,an)時的nim遊戲的一種必勝策略是把ai 變成k,那麼原遊戲的一種必勝策略就是把第i枚棋子移動到乙個sg值為k的頂點。這就相當於可以看做,每次最聰明的操作是按照nim遊戲sg(n)值來移動,例如我們想把sg(n)變為sg(小於n),就滿足最聰明移動,但我們真正移動的又不是sg(n)的值,移動的是原來頂點n的值,咦,好像也是哦,沒關係,我們依舊移頂點n的值,只是說移動頂點n的值時,要滿足移動後頂點值(小於n),sg(小於n)的值是我們想要的最聰明的sg值。

這就好像我們敲**,我們通過高階程式語言來間接寫機器語言執行計算機。

計算1~n的sg函式值步驟如下:

1、使用 陣列f 將 可改變當前狀態 的方式記錄下來。

2、然後我們使用 另乙個陣列 將當前狀態x 的後繼狀態標記。

3、最後模擬mex運算,也就是我們在標記值中 搜尋 未被標記值 的最小值,將其賦值給sg(x)。

4、我們不斷的重複 2 - 3 的步驟,就完成了 計算1~n 的函式值

**:

//f[n]:可改變當前狀態的方式,n為方式的種類,f[n]要在getsg之前先預處理

//sg:0~n的sg函式值

//s:為x後繼狀態的集合

int f[n],sg[maxn],s[maxn];

void getsg(int n)

}}

給出一道入門級的題目

hdu 1848

#include #include#includeusing namespace std;

const int maxn=1010;

#define n 20

int f[n],sg[maxn],s[maxn];///f可走步數//s後繼存在狀態

void getsg(int n){

int i,j;

memset(sg,0,sizeof(sg));///pn點

for(i = 1; i <= n; i++){///從i=1開始

memset(s,0,sizeof(s));///每次初始化s後繼存在狀態

for(j = 0; f[j] <= i && j < n; j++)///f[i]我的標籤:做個有情懷的程式設計師。

SG函式入門 HDU 1848

sg i 為0表示i節點先手必敗。首先定義mex minimal excludant 運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數 例如mex 3 mex 0 mex 0。對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague grundy 函式g如下 g x mex,...

SG函式和SG定理

大神鏈 我們先用乙個簡單的例子引入 考慮有這樣乙個遊戲,有3堆火柴,分別有a,b,c根,記為 a,b,c 每次乙個遊戲者可以從任意一堆中拿走至少一根火柴,也可以整堆拿走,但是不能從多堆火柴中拿 無法拿火柴的人輸 這個遊戲就叫做nim遊戲 舉個例子,假設a 1,b 2,c 3,若你先拿,你會怎麼辦呢?...

sg函式和sg定理

下面這篇解釋得很清楚。單個遊戲 sg 0 0 sg值為0的有且只有必敗態 sg x mex sg y x的所有後繼狀態中 第乙個不能達到的sg值,則x可到達sg為0 sg x 1的狀態 組合遊戲 可將sg值看作為石子數,則轉化為nim取石子遊戲,總遊戲的勝負由sg的異或和決定。hdu1848 1 i...