基础博弈

基本博弈
(一)巴什博弈(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
解:若为M+1的倍数先手输,否则先手胜

(二)斐波拉博弈(Fibonacci Game):一堆石子有n个,两人轮流取,先取者第1次可以取任意多个,但不能全部取完,以后每次取的石子数不能超过上次取子数的2倍。取完者胜。
解:当N为斐波拉系数时先手输,否则先手胜

(三)威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
关键:
1。任何自然数都包含有且仅有一个奇异局势中。
2。任意操作都可以将奇异局势变为非奇异局势。
3。采用适当方法可将非奇异局势变为奇异局势。
解:当为奇异局势先手输,否则先手胜(见代码)
#include <bits/stdc++.h>
using namespace std;
int main (){
int a,b;
while (scanf("%d %d",&a,&b)!=EOF){
   		 if (a>b)swap(a,b);//保证A<=B
  		 if (a==(int)((b-a)*(1+sqrt(5.0))/2))//判断是不是斐波拉数
   			 printf ("first lose\n");//是则输
   		else printf ("first win\n");//否则赢
}
return 0;
}

(四)尼姆博弈(Nimm Game):有N堆各若干个物品,两人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
解:N堆石子数异或一下,非零时先手胜。
题目:Hud1850
Nimm Game,问先手胜有几种拿法
特别说明,判断几种拿法时逐堆判断,ans与该堆石子数异或后则该堆石子数异或了两次,所得的值是待被异或为0的值,若这个值小于该堆石数,则可行
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[105],ans,cnt;
    while(cin>>n&&n){
        ans=cnt=0;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            cin>>a[i];
            ans^=a[i];
        }
        if(ans==0)puts("0");
        else{
            for(int i=0;i<n;i++){
                int k=ans^a[i];
                if(k<a[i])cnt++;
            }
            cout<<cnt<<endl;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值