POJ 1067 取石子游戏 [博弈]

题意:威佐夫博弈。

思路:看了很多证明都没看懂。最后决定就记住结论好了。

对于所有的奇异局面(必败局),有通项公式

Pi = (a, b), (a = i * [(sqrt(5) + 1) / 2], b = a + i) 其中[]表示取整,如[3.9] = 3, [4.1] = 4。

那个(sqrt(5) + 1) / 2就是传说中的黄金分割了。

根据这个通项公式,可以发现a与b之间的关系,a = (b - a) * [(sqrt(5) + 1) / 2]。

因此对于一个给定的局面(a, b),只要判断其是否有这个关系就知道是不是必败了。此外还要注意,如果a > b,应将两者的值互换一下,这是为了方便直接套用上面的公式。

 1 #include<stdio.h>

 2 #include<algorithm>

 3 #include<math.h>

 4 using namespace std;

 5 int main()

 6 {

 7     int a, b;

 8     double tem = (sqrt(5.0) + 1.0) * 0.5;

 9     while (~scanf("%d%d", &a, &b))

10     {

11         if (a > b) swap(a, b);

12         int x = b - a;

13         if ((int)(x * tem) == a) printf("0\n");

14         else printf("1\n");

15     }

16     return 0;

17 }

 

你可能感兴趣的:(poj)