首先我们来回顾一下威佐夫博奕。
问题:有两堆石子,博弈双方每次可以取一堆石子中的任意个,不能不取,或者取两堆石子中的相同个,先取完者为胜。
分析:这时候,我们要分析奇异局势。第一个奇异局势就是(0,0),当某人遇到(0,0)的时候,就必输,说明前一个人已经取光了全部的石子。
接下来的奇异局势分别是(1,2),(3,5),(4,7),(6,10)......
分析一下可以发现,奇异局势的前一个值就是前边局势中没有出现过的最小的正整数,第二个值就是第一个值+k(k就是第k个)。
当先手遇到奇异局势,在双方都不出现失误的情况下,先手必输,反之,后手必输。
这时候我们已经可以自己写出接下来的奇异局势了。但是如果题目中给出了你一个局势,如何判断它是不是奇异局势。
我们分析一下,先把每个奇异局势的差值求出来,根据上边的描述可以知道是k。我们再分析一下可以得到差值*1.618等于第一个数,也就是比较小的那个数字。
而1.618=(sqrt(5)+1)/2。这样,很容易就可以判断出是否为奇异局势,也可以轻松判断出谁输谁赢了。
代码如下:
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int temp=abs(a-b);
double eps=(sqrt(5)+1)/2;
if(floor(temp*eps)==min(a,b))
printf("0\n");
else
printf("1\n");
}
return 0;
}
本文详细解析了威佐夫博弈的规则与策略,探讨了如何通过数学方法判断局势的优劣,提供了判断奇异局势的算法及代码实现。
1万+

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



