天天看点

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