问题描述
有n个硬币,围成一个圆,两人比赛,每人每次可拿走一个或两个相邻的硬币,最后一个拿硬币的人胜出。现在给出初始硬币的数量,问先取的人会获胜,还是后取的人获胜。
关键/核心
对称博弈!
无论怎样取,先手肯定期望自己胜,而后手也期望自己胜,
没有人期望自己败!对每一步决策,各方都是为了自己胜利!
分析问题
当n=1时,先手胜
当n=2时,先手胜
当n=3时,先手败
当n=4时,先手胜
当n=5时,…
发现本质
假设硬币数n>3,当先手取1个或2个硬币时,将剩下n-1个或n-2个硬币,
此时后手取硬币相当于“先手”角色,由于n-1或n-2是确定的数,
此时的“先手”(实际是后手)的胜负将可以确定。
如果你自己推一遍上文“分析问题”的过程,要理解本质很容易
思路
数学归纳法、递归算法、决策树、模拟
解法一:递归算法
#include <iostream>
bool ifWin(int n);
int main()
{
using namespace std;
int n;
cin >> n;
cout << ifWin(n);
return 0;
}
bool ifMe = 0; // 记录每次递归时,取硬币者。递归时,当先手取硬币时,ifMe值为1,否则为0
// 参数n为硬币数,返回1为先手胜
bool ifWin(