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 }