1. 程式人生 > 實用技巧 >SG函式相關知識理解

SG函式相關知識理解

必勝點和必敗點的概念:

P點:必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。 N點:必勝點,處於此情況下,雙方操作均正確的情況下必勝。 必勝點和必敗點的性質: 1、所有終結點是 必敗點 P 。(我們以此為基本前提進行推理,換句話說,我們以此為假設) 2、從任何必勝點N 操作,至少有一種方式可以進入必敗點 P。 3、無論如何操作,必敗點P 都只能進入 必勝點 N。 SG定理:遊戲和的SG函式等於各個遊戲SG函式的Nim和。   首先定義mex運算,這是施加於一個集合的運算   表示最小的不屬於這個集合的非負整數。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
  對於任意狀態 x , 定義 SG(x) = mex(S),其中 S 是 x 後繼狀態的SG函式值的集合。如 x 有三個後繼狀態分別為SG(a),SG(b),SG(c),那麼SG(x) = mex{SG(a),SG(b),SG(c)}。   這樣 集合S 的終態必然是空集,所以SG函式的終態為 SG(x) = 0,當且僅當 x 為必敗點P時。 F表示為當前的可改變當前狀態 例如{1,3,4}三堆在Nim中的石頭 用F[1] = 1 ,F[2] = 3, F[3] = 4表示
SG表示當前的SG值SG(x) = mex(S) S標記陣列 在進行mex操作時進行數字標記
int f[N],SG[maxn],S[maxn];
void getSG(int n) { int i,j; memset(SG,0,sizeof(SG)); for(i = 1; i <= n; i++) { memset(S,0,sizeof(S)); for(j = 0; f[j] <= i && j <= N; j++) S[SG[i-f[j]]] = 1; for(j = 0;; j++) if(!S[j]) { SG[i] = j;
break; } } }