博弈论(巴什博奕,威佐夫博弈,尼姆博弈)

巴什博奕(Bash Game):

只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜

举一个最简单的例子就是,当n=m+1时,此时不管先手取多少,后手都能把剩下的取完,拓展到n等于m+1的倍数时,不管先手取多少,后手都可以取(m+1减去先手取的个数)个,最后先手一定会面临n=m+1的情况,此时先手必败,否则先手必胜

程序代码:

#include<stdio.h>
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    	if(n%(m+1)==0)  
			printf("先手必败\n");
   		else 
			printf("先手必胜\n");
	}
    return 0;
}

威佐夫博弈(Wythoff Game):

有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利

这有一个公式:t=(int)((a-b)*(1.0+sqrt(5.0))/2.0);让t与较小堆石子数相比,如果相等先手必败,否则先手必胜

程序代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b,t;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
	    if(a<b)  
	    {
	    	a^=b;
	    	b^=a;
	    	a^=b;
		}
	    t=(int)((a-b)*(1.0+sqrt(5.0))/2.0);
	    if(t==b) 
			printf("先手必败\n");
	    else 
			printf("先手必胜\n");	
	}
    return 0;
}

尼姆博弈(Nimm Game):

有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜

把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜

程序代码:

#include<stdio.h>
int main()
{
    int n,m,i,count;
    while(scanf("%d",&n)!=EOF)
    {
        count=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&m);
            count^=m;
        }
        if(count==0)  
			printf("先手必败\n");
        else 
			printf("先手必胜\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺志营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值