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

Brave Game(bash game-巴什博弈)

2011-11-25 21:01 162 查看
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
1、 本游戏是一个二人游戏;
2、 有一堆石子一共有n个;
3、 两人轮流进行;
4、 每走一步可以取走1…m个石子;
5、 最先取光石子的一方为胜;
如果游戏的双方使用的都是最优策略,请输出哪个人能赢。

-------------------------------

明显的巴什博弈(简单博弈)题:一种很古老的游戏,双方轮次从某一集合抽取部分,直到最后一人抽空。类似的模型有报数等。

假如我是A,对方是B,一共有n石子,一次最多拿m个,我后拿。如果我想取胜,那么在这个轮流拿石子的过程中我必须看B每次拿多少以计算我每次应该拿多少,这样预期结果是我赢;当然,B也是这样想的。这也是题目的隐含条件。

我赢,即B最后拿完石子后 剩余s个石子(s<m),这样剩下的就够归我了。退一步说,我最后第二次拿完剩L个(m<L<2m)。

那么如何计算以保证最后几步和我预期的一样呢? 现在是B先拿,然后我观察B的拿法,再应对,然后B再拿,我再应对,以此类推。B第一次拿的石子任意,但要小于等于m,假设此后我保证每次B拿的石子和我拿的石子相加为一固定值,那么n个石子里面被分成若干个该固定值,即n=p+k*M(设固定值M,p、k为常数,p、k>=0)。题目已经说明B范围为0~m,我也是,这样我们俩一起就是0~2m,那么所谓的固定值只能为m+1,这样我才能保证不管B拿多少我固定值每次都能取到。有了该固定值,我就能计算了。

首先从B开始拿,经过数个M后,剩余s(s<m)。由公式n=p+k*M,p=s。

好,现在假设B的智商和我是一样的;那么由B先拿,B一开始一定会拿p个,那么剩下来,B保证和我一起拿M,最后肯定是B赢。若p=0,那么我保证我和B每次都拿M,我就赢了。

代码如下:

#include<stdio.h>
main()
{
int t,m,n;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
n%(m+1)==0? printf("second\n"):printf("first\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: