SG 函数,博弈论

讲博弈论,不得不说尼姆博奕,威佐夫博弈,巴什博奕,这是三种经典的博弈, 另外还有斐波那契数列型博弈,等等等。 问题有很多。

不管是取石子还是取石头还是打牌什么的,都可以归结于A,B,两个状态的博弈;

偶尔有简单的博弈, 偏数学规律的, 奇数 或者偶数 赢,质数赢,这样的也有,推推规律就能发现,这是简单的。

在这里我要说的是关于尼姆博弈引申出来的SG函数, 其实尼姆博弈是SG函数的特殊情况;

通常分析两个人。是分析两个人的状态, 是否在必败态上,如果在必败,那么就一定输了,

两种局势,必胜态和必败态。 我们知道从胜到败 有多种选择,(一着不慎,就输了)  而从必败到必胜却只有一条路。


尼姆博弈描述:有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

注意这里描述的是 可以取任意多的物品, 那就是从1-n 都可以取,(假设有n个物品);不可以不取。


而一般的题目,往往会限制,只能取1个,2个或者 4个  特定数目的 个数, 这时我们就必须用到SG函数了。


SG函数讲的是对于现在有x个物品 ,F{}集合表示我可以能取的石子的集合, (假如 一次只能取1,2,4 个石子。  F{}集合= F{1,2,4};) 表示最小的不属于这个集合的非负整数, mex(S) (S表示剩余石头SG函数的集合)

例如 SG[x]=mex(S)=mex(1,2,3,4)=0;

SG[y]=mex(S)=mex(0,1,2,4)=3;

这样定义: 对于任意状态 x定义 SG(x) = mex(S),其中 S x后继状态的SG函数值的集合。如 x有三个后继状态分别为 SG(a),SG(b),SG(c),那么SG(x) = mex{SG(a),SG(b),SG(c)} 这样集合S的终态必然是空集,所以SG函数的终态为 SG(x) = 0,当且仅当 x 为必败点P时。

也就说SG【x】=0 必败态;


就拿取石子为例:

F=(1,3,4);n个石子

x=0,SG[0]=0;

x=1,剩下 1-F{1}=0; SG[1]=mex(SG[0])=1;

x=2 剩下2-F{1}={1,} SG[2]=mex(SG[1])= 0

x=3 剩下 3-F{1,3}={2,0} SG[3]=mex(SG[2],SG[0])==mex(0.0)=1;

x=4 剩下  4-F{1,3,4}={3,1,0}  SG[4]=mex(SG[3],SG[1],SG[0])= mex(1,1,0}=2

依次类推, x=5=SG[5]=3;

   x        0  1  2 3  4  5  6  7  8....

SG[x]    0 1  0  1  2  3  2  0  1....


知道SG 后 剩下的操作就是 求亦或了,  亦或到最后  !=0  先手胜  否则后手胜利;

SG函数求解 :

 SG值的计算方法  

1.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1);

2.可选步数为任意步,SG(x) =x; (尼姆)

3.可选步数为一系列不连续的数,用模板计算。


模板:

int f[N],sg[N],S[N];       
void getSG(int n)  
{  
    int i,j;  
    memset(sg,0,sizeof(sg));  
    //sg[0]=0  必败态 
    for(i=1;i<=n;i++)  
    {  
        memset(S,0,sizeof(S));   // 重置 
        for(j=1;f[j]<=i&&j<=N;j++)  
            S[sg[i-f[j]]]=1;  //后继SG标记 
        for(j=0;j<=n;j++)   // 最小非0  
        {  
            if(!S[j])  
            {  
                sg[i]=j;  
                break;  
            }  
        }  
    }  
}


这样遇到一般的博弈恐惧感就少了许多, 博弈 代码不多,难在推状态,  难的博弈,确实难推


参考博客:http://blog.csdn.net/strangedbly/article/details/51137432


题目链接:

POJ 2234 Matches Game
HOJ 4388 Stone Game II

POJ 2975 Nim
HOJ 1367 A Stone Game
POJ 2505 A multiplication game
ZJU 3057 beans game
*POJ 1067
取石子游戏
POJ 2484 A Funny Game
POJ 2425 A Chess Game
POJ 2960 S-Nim
POJ 1704 Georgia and Bob
POJ 1740 A New Stone Game
POJ 2068 Nim
POJ 3480 John
POJ 2348 Euclid's Game
HOJ 2645 WNim
POJ 3710 Christmas Game 
POJ 3533 Light Switching Game


123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值