怎么理解SG函数及性质
本篇內(nèi)容主要講解“怎么理解SG函數(shù)及性質(zhì)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么理解SG函數(shù)及性質(zhì)”吧!
{
Sprague-Grundy函數(shù)性質(zhì)
所有的終結(jié)點(diǎn)SG值為0(因?yàn)樗暮罄^集合是空集)
SG為0的頂點(diǎn),它的所有后繼點(diǎn)都滿足SG不為0
對(duì)于一個(gè)SG不為0的頂點(diǎn),必定存在一個(gè)后繼滿足SG為0
滿足組合游戲性質(zhì)
所有SG為0定點(diǎn)對(duì)應(yīng)P點(diǎn),SG大于0頂點(diǎn)對(duì)應(yīng)N點(diǎn)
}
hdu1847GoodLuckinCET-4Everybody!
題意:
總共n張牌,雙方輪流抓牌,每人每次抓牌的個(gè)數(shù)只能是2的冪次(即:1,2,4,8,16…),抓完牌,勝負(fù)結(jié)果也出來(lái)了:最后抓完牌的人為勝者。給出n,問先手贏還是后手贏?
PS:當(dāng)然這題可以直接推出 n%3==0必?cái)。駝t必勝。 //巴什博奕
下面介紹另外一種做法
SG值:一個(gè)點(diǎn)的SG值就是一個(gè)不等于它的后繼點(diǎn)的SG的且大于等于零的最小整數(shù)。//同mex()函數(shù)
簡(jiǎn)單點(diǎn)來(lái)講就是當(dāng)前狀態(tài)離最近一個(gè)必?cái)↑c(diǎn)的距離。
SG(x)=mex(S)
S是x的后繼狀態(tài)的SG函數(shù)值集合
mex(S)表示不在S內(nèi)的最小非負(fù)整數(shù)
我們枚舉下牌數(shù)為0-10的SG值:
num: 0 1 2 3 4 5 6 7 8 9 10
sg值:0 1 2 0 1 2 0 1 2 0 1
#include<cstdio>
#include<cstring>
#include<algorithm>
usingnamespacestd;
constintmaxn=1000+10;
intarr[11],sg[maxn];
voidpre(){//把1000以內(nèi)的所有的可能一次拿的牌都算出來(lái)!
arr[0]=1;
for(inti=1;i<=10;++i)arr[i]=arr[i-1]*2;
}
intmex(intx){//這是求解該點(diǎn)的sg值的算法函數(shù)(采用記憶化搜索)
if(sg[x]!=-1)returnsg[x];
boolvis[maxn];
memset(vis,false,sizeofvis);
for(inti=0;i<10;++i){
inttemp=x-arr[i];
if(temp<0)break;
sg[temp]=mex(temp);
vis[sg[temp]]=true;
}
for(inti=0;;++i){
if(!vis[i]){
sg[x]=i;
break;
}
}
returnsg[x];
}
intmain(){
intn;
pre();
while(scanf("%d",&n)!=EOF){
memset(sg,-1,sizeofsg);
if(mex(n))printf("Kiki\n");
elseprintf("Cici\n");
}
return0;
}
總結(jié)
以上是生活随笔為你收集整理的怎么理解SG函数及性质的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Commerce的路由实现(Ro
- 下一篇: PHP中常用的循环方法有哪些