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交替進行某種遊戲規定的操作,每操作一次,選手可以在有限的操作 操作必須合法 集合...