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 }

 

posted @ 2013-08-28 20:09  fenshen371  阅读(177)  评论(0编辑  收藏  举报