其他
取石子游戏,用博弈论教你如何必胜
1.游戏规则
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子(至少取1个)。
1.一是可以在任意的一堆中取走任意多的石子;
2.分析
为方便描述,设表示两堆石子数量分别为,且你先取。
1.表示必胜
2.表示必败
3.石堆没有顺序优先级,所以
2.1首先分析3种特殊情况
1.两堆石子数量一样,两堆都取个,必胜,得
2.2列出前面的几种情况如下:
可以得到如下规律:
奇异局势有,必败 蓝色为先取的数量,一次就可以将状态转为奇异局势,必胜 都可以转为,必胜 都可以转为,必胜 可以转化为的奇异局势,而且也可以转化为
即奇异局势为,且
结论:如果两个人都采取最优策略,面对非奇异局势,先拿必胜;面对奇异局势,后拿必胜。
3.理论推广
这个其实是经典的威佐夫博弈问题,但首先我们先介绍另一个定理,贝蒂定理。
3.1贝蒂定理
设是正无理数,且。
记,(为取整函数)。
则是的一个划分,。
证明如下
1.任一个整数至多在集合P或Q中出现一次。
,对于不同整数各不相同。
2.(反证法)
假设,则存在正整数使得,
即
,,
两式相加得
,与为整数矛盾。
3.(反证法)
假设,则存在正整数使得,
由此得(因为a是无理数),
类似有
,
两式相加得
,与为整数矛盾。
3.2回归威佐夫问题
设奇异局势构成的序列组为,即为通项公式,可以看出是一个贝蒂序列。
设,
因为,即。
代入,得。
即。
而。
3.3如何快速判断
给定一个局势,得,
如果,则是奇异局势,否则不是。
3.4例题
poj1067:http://poj.org/problem?id=1067
3.5代码实现
const double q = (1 + sqrt(5.0)) / 2.0;
bool isWythoff(int a, int b) {
int t;
if (a > b) t = a, a = b, b = t;
return (int) ((b - a) * q) == a;
}
- EOF -
1、图论入门
觉得本文有帮助?请分享给更多人
推荐关注「算法爱好者」,修炼编程内功
点赞和在看就是最大的支持❤️