組合遊戲 SG函式和SG定理

2021-08-05 18:27:01 字數 3127 閱讀 5205

在介紹sg函式和sg定理之前我們先介紹介紹必勝點與必敗點吧.

必勝點和必敗點的概念:

p點:必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。

n點:必勝點,處於此情況下,雙方操作均正確的情況下必勝。

必勝點和必敗點的性質:

1、所有終結點是 必敗點 p 。(我們以此為基本前提進行推理,換句話說,我們以此為假設)

2、從任何必勝點n 操作,至少有一種方式可以進入必敗點 p。

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

我們研究必勝點和必敗點的目的時間為題進行簡化,有助於我們的分析。通常我們分析必勝點和必敗點都是以終結點進行逆序分析。我們以

hdu 1847 good luck in cet-4 everybody!

為例:當 n = 0 時,顯然為必敗點,因為此時你已經無法進行操作了

當 n = 1 時,因為你一次就可以拿完所有牌,故此時為必勝點

當 n = 2 時,也是一次就可以拿完,故此時為必勝點

當 n = 3 時,要麼就是剩一張要麼剩兩張,無論怎麼取對方都將面對必勝點,故這一點為必敗點。

以此類推,最後你就可以得到;

n    :   0    1    2    3    4   5    6 ...

position:  p    n   n    p   n   n   p ...

你發現了什麼沒有,對,他們就是成有規律,使用了 p/n來分析,有沒有覺得問題變簡單了。

現在給你乙個稍微複雜一點點的: 

hdu 2147 kiki's game

現在我們就來介紹今天的主角吧。組合遊戲的和通常是很複雜的,但是有一種新工具,可以使組合問題變得簡單————sg函式和sg定理。

sprague-grundy定理(sg定理):

遊戲和的sg函式等於各個遊戲sg函式的nim和。這樣就可以將每乙個子遊戲分而治之,從而簡化了問題。而bouton定理就是sprague-grundy定理在nim遊戲中的直接應用,因為單堆的nim遊戲 sg函式滿足 sg(x) = x。不知道nim遊戲的請移步:這裡

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[0]=0,f=,

x=1 時,可以取走1 - f個石子,剩餘個,所以 sg[1] = mex= mex = 1;

x=2 時,可以取走2 - f個石子,剩餘個,所以 sg[2] = mex= mex = 0;

x=3 時,可以取走3 - f個石子,剩餘個,所以 sg[3] = mex = mex =1;

x=4 時,可以取走4-  f個石子,剩餘個,所以 sg[4] = mex = mex = 2;

x=5 時,可以取走5 - f個石子,剩餘個,所以sg[5] = mex =mex = 3;

以此類推.....

x        0  1  2  3  4  5  6  7  8....

sg[x]    0  1  0  1  2  3  2  0  1....

由上述例項我們就可以得到sg函式值求解步驟,那麼計算1~n的sg函式值步驟如下:

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

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

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

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

**實現如下:

[cpp]view plain

copy

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

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

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

intf[n],sg[maxn],s[maxn];  

void

getsg(

intn)  

}  }  

現在我們來乙個實戰演練(題目鏈結

):只要按照上面的思路,解決這個就是分分鐘的問題。

**如下:

[cpp]view plain

copy

#include 

#include 

#define maxn 1000 + 10

#define n 20

intf[n],sg[maxn],s[maxn];  

void

getsg(

intn)  

}  }  

intmain()  

return

0;  

}  

poj 2234 matches game

hoj 4388 stone game ii

poj 2975 nim

hoj 1367 a stone game

poj 2505 a multiplication game

zju 3057 beans game

poj 1067 取石子遊戲

poj 2484 a funny game

poj 2425 a chess game

poj 2960 s-nim

poj 1704 georgia and bob

poj 1740 a new stone game

poj 2068 nim

poj 3480 john

poj 2348 euclid's game

hoj 2645 wnim

poj 3710 christmas game 

poj 3533 light switching game

組合遊戲 SG函式和SG定理

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

組合遊戲 SG函式和SG定理

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

組合遊戲 SG函式和SG定理

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