威佐夫博弈,是博弈论的一种基本模型,两堆各若干个物品,两个人轮流从任意一堆中取出至少一个或者同时从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜利。
首先对于(0 , 0)那么先手是必败的
其次我们看对于(1,2)枚举了所有情况发现无论怎样,先手必败
而对于还有先手必败的情况,是(3,5)
(4,7)
(6,10)
(8,13)..........
可以选择枚举一下就会知道了
然而发现它们的差值竟然神奇地是:1,2,3,4,5……n
同时,我们把差值与第一堆石子的个数比较,竟然接近于了1.618 = 1 + 0.618 !
所以对于先手必败的情况,我们就有情况进行讨论了
首先1.618 = (sqrt(5)+1)/2
如果差值与1.618的积不为第一堆的石子个数,那么先手必胜,否则先手必败
注意精度问题
double n1 = min( n , m );
double m1 = max( n , m );
n = min( n , m );
if( (int)(( m1 - n1 ) * temp) == n ){
printf( "先手必败\n" );
}
else
printf( "先手必胜\n" );