[Bash Game]hdu1846 hdu2147 hdu2149 hdu2188

最简单的博弈题,通过p/n 方法来思考,通过加减模来实现。

注:编写程序的时候,我喜欢把退化情况也写如全部情况中,这样可以减少思考的时间,计算机就是一个把复杂的东西,一块一块实现的过程。

 

Bash Game 就是一个名叫first 一个名叫second 的两个人拿一堆石子(n个),一次最多拿m个最少拿1个,先拿完的赢,两个足够聪明 (很明显是我足够聪明,你妹呀。。)大家看出来了,first先拿ok?,问最后谁赢。

 

P为first必败点

N为first必胜点

4步走画图:

1.把所有终点标记为P点必败点,啥意思?如果拿光了,轮到first拿了,相当于second拿光了,first站在终点,GG!!(由于题目可能有变种,所以终点有时候是不同的,这道题是0点。

2.一步到P点的点为N点,你想呀,如果first拿到了一数量,然后轮到second傻傻的站到了first的必败点P点,发现自己变成first了,我操!!郁闷。second必败则first必胜,哦也!!(脑海里面是暴走漫画姚明)

3.如果某一个点 不论怎么走都只能到N点,那么标记为P点,唉。。如果first站在某一点,不论怎么拿,都是到达first的必胜点,发现second变成了first。。(暴走漫画里面的。。注定孤独一生。。。 )

4.如果第三步出现了新的P点,果断跑到第二步继续。。

 

累死了,说完了,不过同学们不要直接实现。。要画出来,看看能不能通过数学方法,一下得到答案,这就像 F(x)=F(x-1)+1 F(0)=1一样。。。不能用循环算。。。

 n=10 m=2

0  1   2    3  4    5     6   7    8   9   10

P  N   N   P  N    N    P    N   N   P   N 

n%(m+1)==0 first 完败,否则 first完胜

如何拿才能赢:

从n开始,找到最近的一个P只要每次都拿到位置P就一定能赢,当然说的是可以赢的情况。。

比如哦 F=first S=second

F 1  n=9

S 2  n=7

F 1 n=6

S 1 n=5

F 2 n=3

S 1 n=2

F 2 n=0 

所以赢了,不论S怎么拿,我们只要拿到P点就好,如何拿到?

hdu2149代码思考下(先看题,这个题有点不同)

re1(u,m) 为for(int u=1;u<=(m);u++) 

re1(u,m){
if(n-u<0 || (n-u)%(m+1)==0)
ans.push_back(u);

hdu2147 可以用p/n来画图,感觉很好玩,可以尝试之后寻找到规律。。如果厉害,找到规律可以像knuth一样数学归纳法证明是对的。。我不会。。

posted @ 2013-01-04 01:08  GGGin  阅读(242)  评论(0编辑  收藏  举报