巴什博弈
一般对于这类博弈类的题目,都有一个条件:“两人足够聪明”或者"两人没有失误"
硬币游戏
想必大家小时候都有玩过这么一个游戏
两个人博弈,每个人每次可以拿1-3枚硬币,轮流拿,总共n枚硬币,最后取光者胜,这就是一个很典型的巴什博弈
对于上面的取硬币问题,我们举三个例子
不妨设甲是先手,乙是后手
- 总共4枚硬币,甲无论怎么取都是输
- 总共5枚硬币,甲只要第一次取1枚硬币,乙无论怎么取,甲都是赢
- 总共4n枚硬币,甲无论怎么取都是输,甲每次取x枚,乙接着取4-x枚,乙就一定能赢
这就是一个很典型的巴什博弈
巴什博弈
巴什博弈(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规
定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)∗r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(k≤m)个,那么先取者再拿走m+1−k个,结果剩下(m−1)×(r−1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
巴什博弈博弈论里面最简单的一种形式。以下题目利用巴什博弈可以轻松解决:
-
http://acm.hdu.edu.cn/showproblem.php?pid=1846 (brave game)
-
http://acm.hdu.edu.cn/showproblem.php?pid=2147 (kiki's game)
-
http://acm.hdu.edu.cn/showproblem.php?pid=2149 (public sale)
下面介绍分析此类题目的通用方法:P/N分析:
P点: 即必败点,某玩家位于此点,只要对方无失误,则必败;
N点: 即必胜点,某玩家位于此点,只要自己无失误,则必胜。
以上题目均可以通过P/N分析法来解决。
例如上面的硬币问题,4的倍数点都是P点,其他点都是N点
三个定理
一、所有终结点都是必败点P(上游戏中,轮到谁拿牌,还剩0张牌的时候,此人就输了,因为无牌可取
二、所有一步能走到必败点P的就是N点
三、通过一步操作只能到N点的就是P点
代码实现
bool Bash_Game (int n,int m){//判断先手是否必赢
if(n%(m+1)==0)return false;
else return true;
}
本文参照:https://www.cnblogs.com/java20130726/archive/2013/05/24/3218207.html
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!