题意:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜
解题报告:威尔夫博弈问题:奇异局势下先手必败,非奇异局势下先手必胜,考虑找到奇异局势..
我们有如下公式:(ak,bk),其中bk= ak + k,那么它为奇异局势
ak =[k(1+√5)/2](下取整), bk= ak + k (k∈N)奇妙的是其中出现了有关黄金分割数的式子:(1+√5)/2 =1.618...,若两堆物品个数分别为x,y(x<y),则k=y-x,再判断x是否等于[(y-x)*( √5+1)/2] 即可得知是否是奇异局势。
#include<iostream>
#include <stdio.h>
#include <cmath>
int main()
{
int m,n,k,data;
while(scanf("%d%d",&m,&n)!=EOF)
{
if (m>n)
{
int t;
t = m;
m = n;
n =t;
}
k = n - m;
data = floor(k*(1.0+sqrt(5.0))/2.0);//floor的用法:是向下取整的意思
if (m == data)
printf("0\n");
else
printf("1\n");
}
return 0;
}