巴什博弈:
只有一堆 n 个物品,两个人轮流从这堆物品中取物,规定每次至少取
一个,最多取 m 个,最后取光者得胜。
分析:如果最后只剩m个,那么将要取的人获胜,所以获胜者只要每次将石子都去到(m+1)*k即可。
结论:那么判定条件就是:n%(m+1)!=0 先手赢,否则,后手赢。
威佐夫博奕:
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多
的物品,规定每次至少取一个,多者不限,最后取光者得胜。
分析:这是一个关于黄金分割的问题,首先求出 黄金分割比*两堆石子差值,然后判断这个值是不是等于小石子堆的个数。
结论:代码:
if( stone_num_1>stone_num_2 )
swap(stone_num_1,stone_num_2);
double ju = (double)(stone_num_2-stone_num_1) * (sqrt(5)+1.)/2.;//精度越高越好
if( ju == stone_num_1)
printf("Lose\n"):
else
printf("Win\n");//到底是赢是输,套样例
尼姆博弈
有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,
规则如下:
1)每一步应取走至少一枚石子,每一步只能从某一堆中取走部分或全部石子;
2)如果谁取到最后一枚石子就胜
分析:判断所有的值全部按位异或是不是0
结论:代码如下
ju = stone_num[0]; //初值为第一个的石子数目
for(int i=1;i<n;i++)
ju = ju ^ stone_num[i];
if(ju==0)
printf("Lose\n");
else
printf("Win\n");