SG函式 與 ICG問題

2022-02-27 18:32:17 字數 1525 閱讀 3013

icg(impartial combinatorial games)遊戲是組合遊戲(combinatorial games)的一類

滿足如下性質:

①有兩名玩家

②兩名玩家輪流操作,在乙個有限集合內任選乙個進行操作,改變遊戲當前局面

③乙個局面的合法操作,只取決於遊戲局面本身且固定存在,與玩家次序或者任何其它因素無關

④無法操作者,即操作集合為空,輸掉遊戲,另一方獲勝

nim遊戲是經典的icg遊戲,也是組合遊戲的乙個重要模型,非常的經典

對於n堆石子,兩名玩家輪流取走其中一堆中的若干石子,不能取走者拜

結論:我們將石子數異或起來,為0則先手必敗,否則先手必勝

這樣的結果也成為nim和

普通的icg遊戲可能就沒有nim遊戲來的那麼直接,可能會加上若干限制條件,這個時候就需要動用sg函式了

我們將遊戲局面和操作抽象為乙個dag圖

我們定義乙個局面x的\(sg(x) = mex(sg(y))\)

其中y是x可直達的點,\(mex\)指取未出現的最小的非負整數

例如\(sg(x) = mex(0,1,3) = 2\)

顯然終止狀態的sg函式為0

\(sg函式的性質\)

sg為0的狀態為必敗態

如果乙個局面sg函式非0,說明其一定可以到達sg為0的狀態,所以必勝

如果乙個局面的sg函式為0,說明其要麼是終止態,可達的局面均非0,必敗

\(sg函式解決icg遊戲\)

思考sg函式的定義,如果乙個局面\(sg(x) = k\),意味著其下一步一定會到達乙個小於k的局面,而且任意小於k的局面都可達

像不像取石子?沒錯

若icg遊戲分成若干個獨立的遊戲,我們求出每個遊戲的sg函式並求出nim和,就可以判斷局面的勝敗

sg函式的求法:

如果局面集合不大,可以搜尋

如果局面集合很大,就要通過打表找規律數學推導找到普遍規律,進而加速sg函式的求解

以bzoj1228為例

經打表找規律後,可以發現

sg(a,b) =

①a,b為奇,0

②a,b為偶,sg(a/2,b/2) + 1

③否則設b為奇數,sg(a,b + 1)

#include#include#include#include#include#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define redge(u) for (int k = h[u],to; k; k = ed[k].nxt)

#define bug(s,n) for (int i = 1; i <= (n); i++) cout<57)

while (c >= 48 && c <= 57)

return out * flag;

}int sg(int x,int y)

return re;

}int main()

return 0;

}

freopen函式 SG函式與SG定理

sg函式是用來解決acm競賽中公平組合遊戲問題的利器 在介紹sg函式和sg定理之前我們先介紹介紹必勝點與必敗點.必勝點和必敗點的概念 p點 必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。n點 必勝點,處於此情況下,雙方操作均正確的情況下必勝。必勝點和必敗點的性質 1 所有終結點是...

SG定理與SG函式 模板

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

(組合遊戲)SG函式與SG定理詳解

後面會繼續努力的。這csdn的markdown編輯器又改版了越來越難用了 好了,進入主題,說一下sg函式和sg定理吧 在競賽中,組合遊戲的題目一般有以下特點 題目描述一般為a aa,b bb 2人做遊戲 a aab bb交替進行某種遊戲規定的操作,每操作一次,選手可以在有限的操作 操作必須合法 集合...