博弈,就分别介绍一下巴什博弈,威佐夫博弈,尼姆博弈,外加一个SG函数。
首先我们还是讲一下必胜点和必败点。
P点:必败点,就是说,谁在这个位置,在双方都操作正确的情况下必败。
N点:必胜点,在这个位置的时候,双方操作正确的情况下必胜。
必败点与必胜点性质:
1.所有的终结点都是必败点p。
2.从任何必胜点N操作,至少有一种方式可以进入必败点P。
3.无论如何操作,必败点p都能进入必胜点。
我们研究必败点和必胜点就是为了对题目中的模型进行简化。
巴什博弈
模型
有一堆n个物品,两个人轮流从这堆物品中取物品,规定每次至少取一个,最多取m个,最后取光着胜。
-
(n% (m+1)==0,先取着必败)。
-
其余情况下,先取着必胜。
威佐夫博弈
模型
有两堆各若干物品,两个人轮流从某一堆或者同时从两堆中取同样多的物品,规定每次最少取一个,多着不限,最后取光着胜。 -
假设有两堆a,b;设a>b,k=a-b;
-
若 a ∗ ( s q r t ( 5 ) + 1 ) / 2 ∗ k = = b a*(sqrt(5)+1)/2*k==b a∗(sqrt(5)+1)/2∗k==b那么就为必败态,否则必胜。
尼姆博弈
模型
有n堆若干物品,两个人轮流从这某一堆物品中取物,规定每次最少取一个,最后取光着为胜。
- 全部 全部异或一遍,判断是否为0就可以得出是否为必胜态。
SG函数
性质:
-
- 所有总结点对应的顶点其SG值都是0,因为它的后继全是空集——所有的终结点是必败点(P点)。
-
- 对于一个SG(x)=0的顶点x,它的所有的后继y都满足SG(y)!=0——无论如何操作,从必败点(P点)都能进入必胜点(N点)//对手走完又能把N留给我们。
- 3.对于每一个SG(x)!=0的顶点x,必定存在一个后继点SG(y)=0,——从任何必胜点(N点)操作,至少有一种方法可以进入必败点(p点)//那就是我们要走的方法。
SG函数有多种求法。
打表法
int f[N];//可以取的石子数。
int sg[N],vis[N],ps;
void get_sg(int n)
{
memset(sg,0,sizeof(0));
for(int i=1;i<=n;i++)
{
memset(vis 0,sizeof(vis));
for(int j=1;f[j]<=i&&j<=ps;j++)
{
vis[sg[i-f[j]]=1;
}
for(int j=0;j<=n;j++)
{
if(!vis[j])
{
sg[i]=j;
break;
}
}
}
}