对称博弈:取硬币问题(C++实现)

问题描述

问题描述
有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(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值