poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067
题意:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。
输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。
贴一个博弈论总结的博客:http://www.cnblogs.com/lmnx/articles/2482963.html
黄金分割比例判断是不是非奇异局势,面对奇异局势必败 两个人如果都采用正确操作,
那么面对非奇异局势,先拿者必胜, 反之,则后拿者取胜。
公式 ak =[k(1+√5)/2],bk= ak + k
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int main() 6 { 7 int x, y, t; 8 while(cin>>x>>y) 9 { 10 if(x>y) 11 { 12 t = x; 13 x = y; 14 y = t; 15 } 16 if(x == (int)((y-x)*(1+sqrt(5.0))/2)) 17 cout<<"0"<<endl; 18 else 19 cout<<"1"<<endl; 20 } 21 return 0; 22 }