博弈基础

转载自:http://colorfulshark.cn/wordpress/巴氏(bash)威佐夫(wythoff)尼姆(nim)博弈之模板-823.html

首先是Bash(巴氏)博弈,这是比较简单的一种,原理就不解释了,相信大家都懂,代码很简短,只需要输入这一堆石子的数目,输赢立刻见分晓

    #include<iostream>   
    using namespace std;   
    int main(void)   
    {   
        int cas,total,price;   
        scanf("%d",&cas);   
        while(cas--)   
        {   
            scanf("%d%d",&total,&price);   
            if(total%(price+1))   
                cout<<"先手赢"<<endl;   
            else   
                cout<<"先手输"<<endl;   
        }   
        return 0;   
    }   

接下来上威佐夫(Wythoff)博弈,石子变成两堆,难度也大幅提升,黄金分割比的是奇异局势

    #include<iostream>  
    #include<cmath>  
    #include<stdio.h>  
    using namespace std;  
    int main ()  
    {  
        int a,b,dif;  
        double p=(sqrt((double)5)+1)/double(2);  
        while(cin>>a>>b)  
        {  
            dif=abs(a-b);//取差值  
            a=a<b?a:b;//取较小的值  
            if(a==(int)(p*dif))//判断是不是奇异局势  
                printf("0\n");  
            else printf("1\n");  
        }  
        return 0;  
    }  
最后奉上尼姆(Nim)博弈,这种博弈其实就是分解成简单的博弈再一一求解

#include <stdio.h>  
#include <string.h>  
#include <algorithm>  
#include <iostream>  
using namespace std;  
int a[200005],ans[200005][2];  
int main()  
{  
    int n,i,j,cnt,s;  
    while(~scanf("%d",&n),n)  
    {  
        cnt = 0;  
        s = 0;  
        for(i = 0; i<n; i++)  
        {  
            scanf("%d",&a[i]);  
            s^=a[i];  
        }  
        for(i = 0; i<n; i++)  
        {  
            if(a[i] > (s^a[i]))  
            {  
                ans[cnt][0] = a[i];  
                ans[cnt][1] = s^a[i];  
                cnt++;  
            }  
        }  
       if(cnt)//判断先手是胜是负  
        {  
            printf("Yes\n");  
            for(i = 0; i<cnt; i++)  
                printf("%d %d\n",ans[i][0],ans[i][1]);//输出若先手为胜的走法  
        }  
        else  
            printf("No\n");  
            cout<<cnt<<endl;//输出使先手为胜的方案的数目  
    }  
    return 0;  
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值