您的位置:首页 > 运维架构 > Shell

巴什博弈(Bash Game)

2015-01-24 17:15 253 查看
问题模型:

只有一堆n个物品,两个人轮流从这堆物品中取物品,规定每次至少取一个,最多取m个。

解决思路:

若n=m+1时,由于先手最多只能取m个,所以无论先手怎么取,剩下的都可以让后手取完,即后手必胜。

假设n=(m+1)*r+s。

(1)当s不等于0,先手要拿走s个物品,此时后手处于在剩下(m+1)*r个物品的状态进行取物品;假设

后手取k(1<=k<=m)个物品,则先手应该采取的决策时取走m+1-k个,此时让后手处于(m+1)*(r-1)个物品的

状态,如此下去,先手就可以取走最后一个石头,而将(m+1)*0的状态给予后手(即后手无法取物品,无法将

游戏继续,故先手赢)。

(2)当s等于0,后手采用(1)中先手采用的方法可以使得自己必胜,所以此时后手必胜。

总结:

当n=(m+1)*r+s(s!=0),即n%(m+1)!=0时,先手必胜。

当n=(m+1)*r+s(s==0),即n%(m+1)==0时,后手必胜。

巴什博弈的裸题:HDU 1846

推荐题目:HDU 2149&&HDU 4764&&HDU 2188&&HDU 2897&&HDU 1847  

/*////////////////////////////////////
HDU 1846 取石头游戏
题意:n个石子,每次至少取一个,最多取m个,
最后取完石子的人为胜。
分析:n%(m+1)!=0 先手必胜
n%(m+1)==0 后手必胜
////////////////////////////////////*/
#include<cstdio>

int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
if(n%(m+1)!=0)
printf("first\n");
else
printf("second\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  巴什博弈 算法