題意:
給出一系列石子堆,現在每次只能從乙個堆中拿出固定石子數,問輸贏結果。
要點:跟nim博弈很像,但是這次每次只能拿固定個數,所以要用sg函式,下面是sg函式的具體定義:
sg(x) = mex ( sg(y) |y是x的後繼結點 )
其中mex(x)(x是乙個自然是集合)函式是x關於自然數集合的補集中的最小值,比如x= 則mex(x)=3;
什麼是後繼結點?
所謂後繼結點就是當前結點經過乙個操作可以變成的狀態。比如對於娶4石子遊戲,假如每次可以取的數目是1,2,4,當前的石子數目也就是當前狀態是5,那麼5的後繼結點就是=;
如果5的三個後繼結點的sg函式值分別為0,1,3,那麼5的sg值就是集合的補集的最小元素,也就是2。
關於整個遊戲的sg值之和sum,定義sum=sg1 ^ sg2 ^ sg3 ^ ……sgn. 其中^表示按位異或運算。
結論:乙個遊戲的初始局面是必敗態當且僅當sum=0時必敗。
16125861
seasonal
2960
accepted
268k
1141ms
c++833b
2016-09-26 21:02:38
#include#include#include#includeusing namespace std;
const int n = 10003;
int sg[n], vis[n];
int s[108];
void getsg(int n)//sg函式模板
for (j = 0; j <= n; j++)
if (!vis[j])
break;
sg[i] = j; }}
int main()
str += ans ? 'w' : 'l';//ans值若為0說明輸了,不為0則贏
} cout << str << endl;
} return 0;
}
POJ 2960(S Nim) 博弈論,SG函式
題意 兩個人玩遊戲,規則是有n堆石子,分別有a1,a2,an顆石頭,每次從一堆石子中取一些石子,但是可取的石子數是規定了的,必須是中的乙個,誰無法操作就輸。思路 一開始我還是不懂的,不知道怎麼選擇sg函式值。但是回去研讀了一下sg函式的定義,就明白了 相對於樸素的nim遊戲,可取的石子數是有限制的,...
博弈論(階梯博弈)POJ 1704
對階梯博弈的闡述 博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點 1 移到前面去,最後沒有點可以移動的人輸 證明方式 如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放 如何來分析這個問題呢 其實階梯博弈經過轉換可以變為n...
poj1740 博弈論,對稱博弈)
題目 有若干堆石子,每一次需要從一堆石子中拿走一些,然後如果願意的話,再從這堆石子中拿一些分給其它任意堆。不能操作的人負。解析 實際上如果n為偶數,我們就可以把ta們兩兩配對 轉換成只有兩堆石子的情況 按照石子數從小到大排序,兩兩配對成一組,組與組之間互不影響 如果可以完美配對 配對後每一組都有兩堆...