題意:兩個人玩遊戲,規則是有n堆石子,分別有a1,a2,...,an顆石頭,每次從一堆石子中取一些石子,但是可取的石子數是規定了的,必須是中的乙個,誰無法操作就輸。
思路:一開始我還是不懂的,不知道怎麼選擇sg函式值。但是回去研讀了一下sg函式的定義,就明白了:相對於樸素的nim遊戲,可取的石子數是有限制的,那就按照sg函式的定義進行遞迴求解sg值,然後將每一堆的sg值異或,判定一下就可以知道贏還是輸。
**:#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
#define maxn 100+5
#define clr(x,y) memset(x,y,sizeof(x))
int s[maxn],k;
int sg[10000+5];
int sg(int n)
{ if(sg[n]>=0)return sg[n];
if(!n) return sg[n]=0;
int sk[100+5];
clr(sk,0);
for(int i=0;i
POJ2960 S Nim(博弈論 sg函式)
題意 給出一系列石子堆,現在每次只能從乙個堆中拿出固定石子數,問輸贏結果。要點 跟nim博弈很像,但是這次每次只能拿固定個數,所以要用sg函式,下面是sg函式的具體定義 sg x mex sg y y是x的後繼結點 其中mex x x是乙個自然是集合 函式是x關於自然數集合的補集中的最小值,比如x ...
博弈論(階梯博弈)POJ 1704
對階梯博弈的闡述 博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點 1 移到前面去,最後沒有點可以移動的人輸 證明方式 如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放 如何來分析這個問題呢 其實階梯博弈經過轉換可以變為n...
poj1740 博弈論,對稱博弈)
題目 有若干堆石子,每一次需要從一堆石子中拿走一些,然後如果願意的話,再從這堆石子中拿一些分給其它任意堆。不能操作的人負。解析 實際上如果n為偶數,我們就可以把ta們兩兩配對 轉換成只有兩堆石子的情況 按照石子數從小到大排序,兩兩配對成一組,組與組之間互不影響 如果可以完美配對 配對後每一組都有兩堆...