8.7通过华为机试平台进行模拟测试,遇到了抓石子的问题,思考到半夜两点,稍有思路,认为还算正确,今天把程序写完提交,不知为何8个测试用例有1个未通过,上网查了下这个问题,普遍提示是斐波那契博弈,写斐波那契函数就可以解决问题,猛觉自己的做法较为死板,但是也不认为自己做错了,因此在这写下思路和解法,希望可以有人看到,发现其中的问题。
题目:
将自己带入首先拿石子的角色,考虑面对n颗石子自己的输赢情况,首先自己可以拿的石子数量小于等于(n-1)/3,否则会输,而且如果上一次拿的石子的数量为(n+1)/2,那么我方肯定赢。
n |
(n-1)/3 |
能不能一定赢 |
肯定输的条件 |
备注 |
3 |
0 |
N |
对方上一次拿的石子数量小于2或者是游戏开始第一次抓石子 |
只能拿1或者2颗,对方都可以把石子拿完 |
4 |
1 |
Y |
|
拿1颗石子,对方就满足了石子数量等于3的时候的输的条件,我方赢 |
5 |
1 |
N |
前一次拿的石子的数量小于3 |
拿1颗石子的,剩下4颗石子,对方进入必赢状态,拿2颗石子,剩下3颗石子,对方不满足肯定输的条件,对方赢 |
6 |
1 |
Y |
|
拿1颗石子,则剩下5颗,对方满足肯定输的条件,自己赢 |
7 |
2 |
Y |