[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++)
}
hdu2147 可以用p/n来画图,感觉很好玩,可以尝试之后寻找到规律。。如果厉害,找到规律可以像knuth一样数学归纳法证明是对的。。我不会。。