博弈论

1.尼姆博弈

有n堆物品,每堆分别有物品数量a,b,....z等,两人轮流取,最少取一个,最多不限,最后取光者胜

结论: a^b^c^...^z=0时先手必败


代码如下:

    int n;  //n堆物品
    int tag=0;    //保存异或结果,初始化为0
    int size;   //每堆物品的数量
    cin>>n;
    while(n--)
    {
        cin>>size;
        tag^=size;
    }
    if(tag==0) cout<<"先手败";
    else cout<<"先手胜";


2.巴什博弈

有一堆n个物品,两人轮流取,至少一个,最多m个,最后取光者胜

结论:要给对手留下(m+1)的倍数

拓展:

若最后取光者输,则要 (n-1) % (m+1)==0 时,后手胜利


代码如下:

    int Bash( int n, int m)
    {
        if( n % (m+1) == 0)
            return 0;
        else
            return 1;
    }

3.威佐夫博弈

有两堆物品,两个人轮流从某一堆或者同时从两堆中取出同样多的物品,取光者胜

结论:假设(ai,b)表示两堆物品的数量。当某个人面对(0,0)的局面时,他已经输了,这种局面称之为奇异局面。可用如下公式判断是否为奇异局面: ai =(int)[i(1+√5)/2],bi= ai + i ( i = 0, 1, 2,... ,n)


代码如下:

    int a,b;
    int i;
    cin>>a>>b;
    if(a>b)
    {
        a^=b;
        b^=a;
        a^=b;
    }
    i=b-a;
    k=(int)(i*(1+sqrt(5))/2.0);
    if(a==k)
        cout<<"后手赢";
    else
        cout<<"先手赢(奇异局)";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值