poj 1067 取石子游戏

本文解析了一种经典的博弈问题——威佐夫博弈,并提供了一个简单的C++实现方案。通过分析必败局势,找到了自然数及其差值之间的规律,利用黄金分割比例来判断当前局面是否为必败状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
poj

题意:

中文题哦~O(∩_∩)O

分析:
经典又有趣的博弈问题。。

发现博弈最有意思的是这群人永远都知道 最佳游戏策略 【我怎么就不知道呢】

说正事:
这是一个博弈算法,名为威佐夫博弈。

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

思路:既然要先手赢,那么我们就分析一下 必败局势。
很好看出来:
(0,0),(1,2),(3,5),(4,7),(6,10),(8,13)…..
找规律可发现,所有的自然数都出现且只会出现一次。而两个数的差是递增的。而 第一个数的值=差值*1.618 即(sqrt(5)+1)/2;
所以就很好说了:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
//by mars_ch
using namespace std;
int n,m;
int temp; 
int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        if(n>m) swap(m,n);   //这个要加,宝宝没加。。。
        int k=m-n;
        //printf("%d\n",k);
        temp=floor(k*(sqrt(5.0)+1.0)/2.0);     //这个是.0  因为精度问题   还要强制转化或者向下取整一下
        //printf("%d\n",temp);
        if(temp == n) printf("0\n");
        else printf("1\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值