/*
*威佐夫博奕(Wythoff Game): 有两堆各若干个物品,两个人轮流从某一堆或同时从两
*堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.
*(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量,则
*奇异局面(先手必败, P-Position) ak =[k(1+√5)/2], bk= ak + k (k=0,1,2,...,n 方括
*号表示取整函数)
*/
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 int main() 6 { 7 double arph=(sqrt(5.0)+1.0)/2.0;//黄金分割数 8 int a,b; 9 while (cin>>a>>b) 10 { 11 if (b<a) swap(a,b); 12 int n=b-a; 13 int c=floor(n*arph); 14 if (c==a) cout<<0<<endl; 15 else cout<<1<<endl; 16 } 17 return 0; 18 }
本文介绍了一种经典的两人博弈游戏——威佐夫博弈(WythoffGame)的算法实现。游戏中双方轮流从两堆物品中取物,目标是成为取走最后一堆物品的人。文章详细解释了如何通过数学方法判断当前局面是否为先手必败的局面(P-Position),并给出了具体的C++代码实现。
1万+

被折叠的 条评论
为什么被折叠?



