一、巴什博弈(Bash Game)
只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。
考虑到 若n=m+1 那么 第一个人不论如何取都不能取胜。
进一步我们发现 若 n=k*(m+1)+r; 先取者拿走 r 个,那么后者再拿(1~m)个
n=(k-1)*(m+1)+s; 先取者再拿走s 个 最后总能造成 剩下n=m+1 的局面。
因此,此时先手有必赢策略。
相对应的,若n=k*(m+1) 那么先取者必输。
因此我们可以写出对应的程序(默认 n m都大于0)
int Bash_Game(int n,int m)//是否先手有必赢策略
{
if (n%(m+1)!=0) return 1;
return 0;
}
二、尼姆博弈(Nimm Game)
把n堆抽象为n个非负整数,再将n个整数转化为二进制,然后对n个二进制数按位相加(不进位),若每一位相加都为偶数。那么称这个状态为偶状态,否则称它为奇状态.
可以证明:任何一个偶状态在其中一个数变小后一定成为奇状态,而一个奇状态一定可以通过改变一个数变成偶状态.
前一点很显然,因为一个数变小至少有一位发生改变,这一位就改变了原来的偶状态.
对于后一点,对于一个从高位到低位某一位和为奇的奇状态,必定有一个数的二进制表示在此位为1,对于后面的较低位和为奇的情况,只要把这个数对应位取反即可得到一个偶状态.
XOR 和判断:
如果有奇数个二进制数在第K位为1 那么在这一位上的和为奇,同样的,偶数个1和为偶.
很明显位运算xor满足我们的要求,偶数个1异或和为0,奇数个为1;
由此,终于可以给出算法:
int Nimm_Game(int n)//假设n个数存在数组f[]中,有必胜策略返回1
{
int f

本文深入探讨了三种经典博弈论游戏:巴什博弈、尼姆博弈和威佐夫博奕。通过分析各自的游戏规则和必胜策略,阐述了先手优势和后手优势的判断方法,如巴什博弈的取模判断、尼姆博弈的异或运算以及威佐夫博奕的奇异局势识别。同时,介绍了 Sprague-Grundy 定理在简化复杂游戏状态中的应用。通过实例展示了如何计算 SG 函数值,为解决类似博弈问题提供了理论基础和实践指导。
最低0.47元/天 解锁文章
1179

被折叠的 条评论
为什么被折叠?



