POJ2960 S Nim(博弈論 sg函式)

2021-07-23 04:56:48 字數 1010 閱讀 4482

題意:

給出一系列石子堆,現在每次只能從乙個堆中拿出固定石子數,問輸贏結果。

要點:跟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們兩兩配對 轉換成只有兩堆石子的情況 按照石子數從小到大排序,兩兩配對成一組,組與組之間互不影響 如果可以完美配對 配對後每一組都有兩堆...