常见的博弈问题

巴什博弈:
只有一堆 n 个物品,两个人轮流从这堆物品中取物,规定每次至少取
一个,最多取 m 个,最后取光者得胜。
分析:如果最后只剩m个,那么将要取的人获胜,所以获胜者只要每次将石子都去到(m+1)*k即可。
结论:那么判定条件就是:n%(m+1)!=0 先手赢,否则,后手赢。

威佐夫博奕:
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多
的物品,规定每次至少取一个,多者不限,最后取光者得胜。
分析:这是一个关于黄金分割的问题,首先求出 黄金分割比*两堆石子差值,然后判断这个值是不是等于小石子堆的个数。
结论:代码:

    if( stone_num_1>stone_num_2    )
        swap(stone_num_1,stone_num_2);
    double ju = (double)(stone_num_2-stone_num_1)  * (sqrt(5)+1.)/2.;//精度越高越好
    if( ju == stone_num_1)
        printf("Lose\n"):
    else
        printf("Win\n");//到底是赢是输,套样例

尼姆博弈
有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,
规则如下:
1)每一步应取走至少一枚石子,每一步只能从某一堆中取走部分或全部石子;
2)如果谁取到最后一枚石子就胜
分析:判断所有的值全部按位异或是不是0
结论:代码如下

    ju = stone_num[0];   //初值为第一个的石子数目
    for(int i=1;i<n;i++)
        ju = ju ^ stone_num[i];
    if(ju==0)
        printf("Lose\n");
    else
        printf("Win\n");

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值