您的位置:首页 > 其它

威佐夫博弈

2017-03-17 21:10 134 查看
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而
bk= ak + k。

结论:
若两堆物品的初始值为(x,y),且x<y,则另z=y-x;
记w=(int)[((sqrt(5)+1)/2)*z  ];
若w=x,则先手必败,否则先手必胜。

#include<stdio.h>
#include<math.h>
#include<iostream>

using namespace std;

int main()
{
int n,m,x;
while(cin>>n>>m)
{
if(n>m)
swap(n,m);
x=floor((m-n)*(1+sqrt(5.0))/2.0);
if(x==n)
cout<<"后手必胜"<<endl;
else
cout<<"先手必胜"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: