一、SG函数
若一个局面S,做一步操作能够到达局面Xi
则一个局面S的SG函数值SG(S),为除所有SG(Xi) 以外的最小非负整数
那么最经典的NIM游戏中,n堆石子,可拆分为n个子博弈,总的SG函数值为所有博弈SG值的异或和;考虑一个堆中石子数为x,则下一步能到0,1,2,…x-1,所以每一个x的SG值就是它本身;因此经典NIM游戏的SG函数值就是所有堆石子的异或和
求SG函数值模板:
int get_SG(int x)
{
bool v[Tmax]; //注意v不能为全局变量
if(SG[x]!=-1) return SG[x];
memset(v,0,sizeof(v));
int tmp,i;
for(i=1;i<=x;i++)
{
tmp=get_SG(max(0,i-3)) xor get_SG(max(0,x-i-2));
v[tmp]=true;
}
for(i=0;i<=n;i++)
if(v[i]==false)
return SG[x]=i;
}
二、Sprague-Grundy定理
博弈的和=多个独立子博弈的析取和
三、Nim博弈
n堆每堆若干物品,两人轮流取,每次可以从任一堆取任意数目,最后取光者胜。
结论,若n个数的异或和(xor)为0,则先手败。
四、巴什博弈
一堆n个物品,两人轮流取,每次至少取1个,最多取m个,最后取光者胜,无法操作者输。
结论,若n%(m+1)==0,则先手败。
五、威佐夫博弈
2堆物品,两人轮流取,要么取任一堆中任意个数,要么在两堆中取相同个数。
结论,设两堆初始为x,y ( x< y),若(int)[(sqrt(5)+1)/2*(y-x)]==x,那么先手败。
六、斐波那契博弈
一堆n个石子,两人轮流取,满足以下规则:
1. 先手第一次不能把所有石子取完
2. 之后每次取的石子数 ∈ [1,对手刚取的石子数*2]
3. 取光者胜
结论,n是斐波那契数,则先手败。