分贝壳游戏
30分解法
在p=q的情况下,是很著名的博弈——巴什博弈。每个k*(p+1)是必胜点,只要先手能取到k*(p+1)的点则先手必胜,取不到则后手必胜。能取到的唯一条件是
100分解法
看起来是个比较复杂的博弈,其实只是巴什博弈的扩展,只需要按照相同思想分类讨论考虑即可。代码很短但是其实需要思考的地方还是比较多的,下面给出思考过程:(p=q已经分析过了,下面是对时的分析)
p>q时
1.n<=p
牛牛一步取完了,牛牛必胜
2.n=p+1
牛牛先手取一个,还剩下p个贝壳,牛妹一次最多取q个贝壳,q<p,所以牛妹一次取不完,然后不管牛妹取多少贝壳牛牛下一次都能取完,所以牛牛必胜
3.n>p+1
3.1牛牛抢到了剩p+1个贝壳的情况
这时不管牛妹取几个贝壳,牛牛都能下次取完,牛牛必胜
3.2 牛妹为了不让牛牛抢到剩p+1个贝壳的情况,形成了场上剩余贝壳<=p+1的情况
3.2.1 剩余贝壳<=p 牛牛一次取完了,牛牛必胜
3.2.2 剩余贝壳=p+1同情况2,牛牛必胜
p<q时
其实逻辑是跟上面一样的,但是多了一种情况,就是p>=n时,因为p先手,所以这种情况下是先手赢,p<n时的分析和上面一样就不在赘述了,因为后手能控制必胜点所以后手必胜
综上所述 p>q时,牛牛必胜。p<q时,p>=n牛牛必胜,否则牛妹必胜。
代码如下:
class Solution { public: /** * * @param n int整型 * @param p int整型 * @param q int整型 * @return int整型 */ int Gameresults(int n, int p, int q) { // write code here int ans; if(p>q)ans=1; else if(q>p) { if(p>=n)ans=1; else ans=-1; } else { if(n%(p+1))ans=1; else ans=-1; } return ans; } };