(二)威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同
时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示
两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们
称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,
10)、(8,13)、(9,15)、(11,18)、(12,20)。
Emmmmm........
说实话没想通啥子原理,只有借结论来用了。。。。
重点:如果定两堆石头分别为ak,bk,如果ak==
(int)((sqrt(5)+1)/2)*k );bk=ak+k(k=0,1,2.....n,ak应该是小于bk的)
则先手必败,否则先手必胜。
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int main()
{
int ak,bk,k,n;
{
scanf("%d%d",&ak,&bk);
if(bk<ak)
swap(ak,bk);
k=bk-ak;
n=int((sqrt(5.0)+1)/2.0*k);
if(ak==n)
printf("后手");
else
printf("先手");
}
return 0;
}