比较难的博弈问题
拿石子问题
一般考虑两种方法:
- 思考问题的规律,直接根据某些特性进行判断
- 递归
0917(Li)
- 两堆石子,你先拿。每次只能从数目多的堆中拿石子,且拿的石子数为另一个堆的整数倍。能拿到某个堆最后一个石子的人获胜。问:你是否能获胜?
- 思考了很久:方法一 - 直接找出特性 -> 没有想出来
- 转递归方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16bool dfs(int x, int y)
{
if (x < y) swap(x, y);
if (x % y == 0) return true;
/**
* 这一步比较难🤔:
* == 1时,必须拿
* x / y > 1时,拿的数量可以控制
* --> 考虑剩下一个整数倍:如果后续为true,则OK
* --> 考虑剩下一个整数倍:如果后续为false,则改变策略
* 拿走(x / y -1)个整数倍:则获胜
* --> 因此,这种情况下,必胜
*/
if (x / y > 1) return true;
return !dfs(y, x % y);
}
比较难的博弈问题
http://example.com/2024/09/17/算法刷题/比较难的博弈问题/