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

Brave Game(bash game-巴什博弈)

2018-02-10 17:19 176 查看
转载自学-无止境
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
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>
int main()
{
int t,m,n;
while(scanf("%d%d",&n,&m)!=EOF)
{
n%(m+1)==0? printf("second\n"):printf("first\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: