博弈论
作者:互联网
博弈论
1.必胜点和必败点和sg函数定义。
2.单个取石子游戏。
sg值的定义就是找到一个不等于后继节点的最小非负整数。
光建就是sg函数。sg[x]=0就是p点,否则就是N点。下面是单个取石子游戏sg函数的计算方法。
第三条求法。利用搜索求解就好。
int f[MAXN],sg[MAXN];//f是可以取得石子数
bool vis[MAXN];//代表后继中有哪些点取了,找到哪个最小的非负整数。
void getSG(int n)//求n的sg值
{
sort(f+1,f+1+n);
memset(sg,0,sizeof(sg));
for (int i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
for (int j=1; f[j]<=i; j++)//f排序是为了让每一种取法都循环到
//if(i-f[j]<0)break;//小于0就不用了//这个条件上面已经有了
vis[sg[i-f[j]]]=1;
for (int j=0; j<=n; j++)
{
if (vis[j]==0)
{
sg[i]=j; break;
}
}
}
}
3.组合取石子游戏
这被lcy老师称为组合游戏的并,只需要求出每个单个游戏的sg值然后异或起来就可以判断这个点是输还是赢。sg值为0是P点。为1则是N点。
4.Anti-nim
标签:石子,游戏,int,博弈论,vis,MAXN,sg 来源: https://www.cnblogs.com/silky----player/p/16519247.html