巴什博奕详解

巴什博弈问题

只有一堆 n 个石子,两个人轮流从这堆石子中取物,规定每次至少取一个,最多取 m 个。最后取光者得胜。两人均采用最优方案

分析过程

假设双方分别为A,B;且指定A为先手。

如果是 n <= m 的情况下:

先手A一次即可取完,A必胜。

故重点讨论 n > m 的情况
当 n = m+1 时:

因为A至多取 m 颗,最少取 1 颗;在此情况下B取时必能取完,故B必胜。

此时推知 m+1 颗石子组合时,可以保证先手必败:
当A取任意 k(1 <= k <= m) 颗时,B只要取走 (m+1)-k 颗,则始终可以保证为 m+1 的倍数

因此,

当 n = k(m+1) 时:

后手B必能取得最后一颗,B必胜。

进一步可知,

当 n = k(m+1) + s ,(1 <= s <= m) 时:

先手A首轮取走 s 颗,则剩余了 k*(m+1) 颗,此时B成为先手,则A必胜。

归纳结论

归纳可知
当 n <= m 时,先手A必胜。
当 n = m + 1 时,后手B必胜。
当 n = k * (m+1) 时,后手B必胜。
当 n = k * (m+1) + s 时,先手A必胜。

可简化为后两条规律。

程序实现

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int t,n,m;
	cin >> t;
	for(int i = 1;i <= t;i++)
	{
		cin >> n >> m;
		if(n % (m+1) == 0)
			printf("Case %d: B win\n", i);
		else
			printf("Case %d: A win\n", i);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值