POJ 1067 威佐夫博奕

本文详细解析了威佐夫博弈的规则与策略,探讨了如何通过数学方法判断局势的优劣,提供了判断奇异局势的算法及代码实现。

首先我们来回顾一下威佐夫博奕。

问题:有两堆石子,博弈双方每次可以取一堆石子中的任意个,不能不取,或者取两堆石子中的相同个,先取完者为胜。

分析:这时候,我们要分析奇异局势。第一个奇异局势就是(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;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值