几种模型均存在奇异局面,即双方均采取最优策略,若处于奇异局面,必败。
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
分析
当总个数小于等于m的时候,先手胜。
当总个数为m + 1的时候,后手胜。
当总个数为m + 2的时候,先手可使后手面对m + 1局面,先手胜。
可推断,若总个数为k *(m + 1),后手胜。
若总个数为k * (m + 1) + s(s <= m),先手胜。
大体思路
if(n % (m + 1) != 0)
return first win;
else
return second win;
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.
结论:当n为斐波那契数时,先手必败。
分析见:https://blog.csdn.net/dgq8211/article/details/7602807
大体思路
void Init()//斐波那契数列,先打表,范围看情况
{
f[0]=f[1]=1;
for(int i=2;i<=55;i++)
{
f[i]=f[i-1]+f[i-2];
}
}
int n;
int flag = 0;
for(int i = 0;f[i];i++){//分别比较,判断出n是否是斐波那契数
if(f[i] == n){
flag = 1;
break;
}
}
if(!flag)
return first win;
else
return second win;
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.
结论:若两堆物品的初始值为(x,y),则另z=abs(y-x);记w=(int)[ ( (sqrt(5)+1) /2 )*z ];若w=min(x,y),则先手必败,否则先手必胜。
大体思路
int z=abs(y-x);
if((int)(((sqrt(5)+1)/2)*z)!=min(x,y))
return first win;
else
return second win;
有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。
结论:判断这几堆物品的异或运算结果是否为0,如果为零,则先手必败。
分析:https://blog.csdn.net/u013514928/article/details/69055286
大体思路
int n;
int a;
int num = 0;
cin >> n;
for(i = 0;i < n;i++){
cin >> a;
num ^= a;
}
if(num)
return first win;
else
return second win;
学习SG函数前,请先康康尼姆博弈。
首先,我们介绍几个知识点:
Sprague-Grundy定理(SG定理): 游戏和的SG函数等于各个游戏SG函数的Nim和。
mex:即不在这个集合中的第一个非负整数。例如:mex{1,2,3} = 0,mex{0,3,5} = 1。
SG函数:
对于任意状态 x , 定义 SG(x) = mex(S),其中 S 是 x 后继状态的SG函数值的集合。如 x 有三个后继状态分别为 SG( a ),SG( b ),SG( c ),那么SG(x) = mex{ SG( a ),SG( b ),SG( c ) }。 这样 集合S 的终态必然是空集,所以当且仅当 x 为必败点P时,SG函数的终态为 SG(x) = 0。