有任意种水果,每种水果个数也是任意的,两人轮流从中取出水果,规则如下: 1)每一次应取走至少一个水果;每一次只能取走一种水果的一个或者全部 2)如果谁取到最后一个水果就胜给定水果种类N和每种水果的个数M1,M2,…Mn,算出谁取胜,编程实现之。
题目的隐含条件是两个人足够聪明,聪明到为了取胜尽可能利用规则。
以上是题目的全部内容,我在考场上简单分析了下决定用递归,但是没想明白。
我的思路和当时的代码
问题转换为谁拿倒数第二种水果的最后一个的问题,继而想到了递归
//返回0表示第一个人赢,返回1表示第二个人赢
//问题归结为,谁拿倒数第二种最后一个苹果谁输
//fruitnum水果种类,a[]对应每种水果个数
int whowins(int fruitnum,int a[])
{
if(fruitnum==1)
return 0;
else
{
考虑水果个数的奇偶性等问题。
}
}
没想太明白这题,希望懂的不吝赐教
用
Java
写了一个:https://github.com/terry83299387/MyTest/blob/master/WouldIWinTheGame.java简单说说我的思路:
注意:这种递归方式可以保证参与游戏的双方都是足够聪明的,因为当
玩家A
拿掉一个或一种水果之后,轮到玩家B
时他也会尽量尝试每种可能让自己获胜,只有所有可能都无法获胜时才会宣告失败。经过再次认真思考,发现这题可以非常简单地计算:
如果水果种类为奇数个,我方肯定能获胜
当水果种类为偶数个时,如果水果总个数为奇数则我方获胜,否则对方获胜
抽了点时间证明了一下上面的结论:
m=1 必胜
m=2 因为任何人都不敢率先拿完一种水果,所以双方都只能一个一个地拿。所以总数为奇数胜
m=3 必胜
m=4 谁都不敢率先拿完一种水果,所以双方都只能一个一个地拿,也就是说,“总数-4”必须是奇数,这样才会让对方进入最终的必败局面,所以总数也必然是奇数个
假设k>=3且k为奇数,且m=k和m=k+1时有上面的结论成立。
至此,用归纳法证明了上面的结论是成立的。(实际上3和4两种情况可以不要,直接由1、2来归纳出最终的结论。但加上3和4会更清晰一些)