欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[博弈论]巴什游戏

最编程 2024-05-03 21:40:35
...

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」。

巴什博弈

简介

巴什博弈(Bash Game):一堆有nn个物品,如果有甲乙两个人。甲和乙轮流从这对物品中选取1m1\sim m个物品,最后取光物品的人获胜,也就是没有取完物品的人输。

思路

若甲先手,设当前物品数为rr

rmr\le m时,甲可一次取完,获胜。

r=m+1r=m+1时,甲无论取多少都会输。

m+2r2mm+2\le r\le 2m时,甲可以取r(m+1)r-(m+1)个,使得无论如何乙取走后剩余个数不超过mm个,甲胜。

根据上述过程,不难发现要想自己赢必须尽可能保证对方拿到m+1m+1个。若甲获胜则需满足n%(m+1)0n\%(m+1)\ne 0

也就是说,如果乙后手获胜需要满足nnm+1m+1的倍数。

算法模板

bool Bash(int n,int m){//这里返回的是先手玩家是否可以获胜
	if(n%(m+1)) return true;
	else return false;
}

例题

hdu1846

大概概括一下,就是有TT组样例,每组一个nnmm表示含义见本文开头,输出第一个人先手时哪个人能获胜,输出获胜的人(first or second)。

#include <iostream>
using namespace std;
bool Bash(int n,int m){
	if(n%(m+1)) return true;
	else return false;
}
int main(){
	int T,n,m;
	cin>>T;
	while(T--){
		cin>>n>>m;
		if(Bash(n,m)) cout<<"first\n";
		else cout<<"second\n";
	}
	return 0;
}

推广

如果规定先取完的人输,那么需要重新考虑策略。

rm+1r\le m+1时,则甲可以只留11个给乙,甲胜。

r=m+2r=m+2时,无论甲取多少,乙都能只留一个给甲,甲输。

m+3r2m+2m+3\le r \le 2m+2时,甲取r(m+2)r-(m+2)个,乙从剩下的m+2m+2取必输。

r=2m+3r=2m+3时,甲输。

总结规律可知(n1)%(m+1)0(n-1)\%(m+1)\ne 0时甲胜,否则乙胜。

算法模板

bool Bash(int n,int m){//这里返回的是先手玩家是否可以获胜
	if((n-1)%(m+1)) return true;
	else return flase;
}