1.巴什博奕(Bash Game)
只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜。
后手必胜:n%(m+1)==0
bash函数
void bash(int n,int m)
{ printf("%s\n",n%(m+1)==0?"后手必胜":"先手必胜");
}
2.威佐夫博弈(Wythoff Game)
有两堆石子,石子数目分别为n和m,现在两个人轮流从两堆石子中拿石子,每次拿时可以从一堆石子中拿走若干个,也可以从两中拿走相同数量的石子,拿走最后一刻石子的人赢。
若两堆物品的初始值为(a,b),且a<b,则另c=b-a;
记gold=(int)[((sqrt(5)+1)/2)*c ]
若gold==a,则后手必胜,否则先手必胜
威佐夫函数
void wythoff(int a,int b)
{
if(a>b) swap(a,b);
int gold=(int)(((sqrt(5)+1)/2)*(b-a));//出现了黄金分割比
printf("%s\n",gold==a?"后手必胜":"先手必胜");
}
3.尼姆博弈(Nimm Game)
有n堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。
把每堆物品数全部异或起来,如果得到的值为0,那么后手必胜,否则先手必胜。
Nimm函数
void nimm(int n)//每一碓数在函数内输入
{
int a,s=0;
while (n--) scanf("%d", &a),s^=a;
printf("%s\n",s==0?"后手必胜":"先手必胜");
}