1.尼姆博弈
有n堆物品,每堆分别有物品数量a,b,....z等,两人轮流取,最少取一个,最多不限,最后取光者胜
结论: a^b^c^...^z=0时先手必败
代码如下:
int n; //n堆物品
int tag=0; //保存异或结果,初始化为0
int size; //每堆物品的数量
cin>>n;
while(n--)
{
cin>>size;
tag^=size;
}
if(tag==0) cout<<"先手败";
else cout<<"先手胜";
2.巴什博弈
有一堆n个物品,两人轮流取,至少一个,最多m个,最后取光者胜
结论:要给对手留下(m+1)的倍数
拓展:
若最后取光者输,则要 (n-1) % (m+1)==0 时,后手胜利
代码如下:
int Bash( int n, int m)
{
if( n % (m+1) == 0)
return 0;
else
return 1;
}
3.威佐夫博弈
有两堆物品,两个人轮流从某一堆或者同时从两堆中取出同样多的物品,取光者胜
结论:假设(ai,b)表示两堆物品的数量。当某个人面对(0,0)的局面时,他已经输了,这种局面称之为奇异局面。可用如下公式判断是否为奇异局面: ai =(int)[i(1+√5)/2],bi= ai + i ( i = 0, 1, 2,... ,n)
代码如下:
int a,b;
int i;
cin>>a>>b;
if(a>b)
{
a^=b;
b^=a;
a^=b;
}
i=b-a;
k=(int)(i*(1+sqrt(5))/2.0);
if(a==k)
cout<<"后手赢";
else
cout<<"先手赢(奇异局)";