码迷,mamicode.com
首页 > 其他好文 > 详细

博弈:巴什博奕(Bash Game)威佐夫博奕(Wythoff Game)尼姆博奕(Nimm Game)

时间:2014-08-28 00:58:38      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:style   color   os   io   for   ar   amp   sp   line   

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜

对于巴什博弈可以考虑:n=(m+1)*k+s,即如果n%(m+1)!=0则先取者只需取走s物品即可保证获胜。

HDU 1846:裸的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
int t,n,m;

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        if(n%(m+1))
            cout<<"first"<<endl;
        else
            cout<<"second"<<endl;
    }
    return 0;
}

HDU 2147 :变形

<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
int n,m;
int main()
{
    while(cin>>n>>m)
    {
        if(n==0&&m==0)
            break;
        if((n-1)%2||(m-1)%2)
            cout<<"Wonderful!"<<endl;
        else
            cout<<"What a pity!"<<endl;
    }
    return 0;
}



HDU 2149 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
int n,m;
int num[1100];
int main()
{
    while(cin>>n>>m)
    {
        if(n<=m)
        {
            for(int i=n;i<=m;i++)
                printf(i==m?"%d\n":"%d ",i);
        }
        else
        {
            if(n%(m+1)==0)
                printf("none\n");
            else
                printf("%d\n",n%(m+1));
        }
    }
    return 0;
}

威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。奇异局势(必败局势):a=k*(1+sqt(5.0))/2,b=a+k,带入有a=(b-a)*((1+sqt(5.0))/2).

HDU 1527 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
#include<cmath>
typedef long long LL;
using namespace std;
int main()
{
    int a,b;
    double q;
    while(cin>>a>>b)
    {
        if(a>b)   swap(a,b);
        q=(1+sqrt(5.0))/2;
        if(a==(int)((b-a)*q))
            cout<<0<<endl;
        else
            cout<<1<<endl;
    }
    return 0;
}

尼姆博奕(Nimm Game有三堆各若干个物品
,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。

HDU 1850:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
#include<cmath>
typedef long long LL;
using namespace std;
int num[110];
int main()
{
    int n,t;
    while(cin>>n&&n)
    {
        t=0;
        for(int i=0;i<n;i++)
        {
            cin>>num[i];
            t=(t^num[i]);
        }
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            if((t^num[i])<num[i])
                cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

待续......


博弈:巴什博奕(Bash Game)威佐夫博奕(Wythoff Game)尼姆博奕(Nimm Game)

标签:style   color   os   io   for   ar   amp   sp   line   

原文地址:http://blog.csdn.net/u013582254/article/details/38880463

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!