我是靠谱客的博主 洁净鼠标,最近开发中收集的这篇文章主要介绍博弈论-Nim游戏,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述

给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。

对于这个问题如果我们每次都有石头可以拿直到取光石头那么就一定可以获胜,那么不妨设集合S{a1…an},分别为n堆石头的数量.
我们先从简单的一堆石头分析,先手一次可以取完石头,必胜.
再从两堆石头分析,当两堆石头数量不一样时,先手将两堆时刻保持一样,后手必败
同理当两堆石头数量一样时,先手必须取石头,那么后手时刻保持两堆石头数量时刻一样后手必胜
结论:a1⊕a2⊕…⊕an≠0,先手必胜;否则先手必败
证明
操作到最后时,每堆石子数都是0,0⊕0⊕…0=0
在操作过程中,如果 a1⊕a2⊕…⊕an=x≠0。那么玩家必然可以通过拿走某一堆若干个石子将异或结果变为0。
证明:不妨设x的二进制表示中最高一位1在第k位,那么在a1,a2,…,an中,由于异或的特点必然有一个数ai,它的第k为时1,且ai⊕x<ai(x前面全为0保持ai不变最高位1被异或成0一定变小),那么从第i堆石子中拿走(ai−ai⊕x(ai−ai⊕x)个石子,第i堆石子还剩ai−(ai−ai⊕x)=ai⊕xai−(ai−ai⊕x)=ai⊕x,此时a1⊕a2⊕…⊕ai⊕x⊕…⊕an=x⊕x=0
在操作过程中,如果 a1⊕a2⊕…⊕an=0a1⊕a2⊕…⊕an=0,那么无论玩家怎么拿,必然会导致最终异或结果不为0。
反证法:假设玩家从第i堆石子拿走若干个,结果仍是0。不妨设还剩下a′个,因为不能不拿,所以0≤a′<ai0≤a′<ai,且a1⊕a2⊕…⊕a′⊕…⊕an=0。那么(a1⊕a2⊕…⊕ai⊕…an)⊕(a1⊕a2⊕…⊕a′⊕…⊕an)=ai⊕a′=,则 ai=a′,与假设0≤a′<a矛盾。
基于上述三个证明:

  1. 如果先手面对的局面是a1⊕a2⊕…⊕an≠0,那么先手总可以通过拿走第i堆(ai⊕x)个石头,将局面变成a1⊕a2⊕…⊕an=0。如此重复,最后一定是后手面临最终没有石子可拿的状态。先手必胜。
  2. 如果先手面对的局面是a1⊕a2⊕…⊕an=0,那么无论先手怎么拿,都会将局面变成a1⊕a2⊕…⊕an≠0,那么同理后手总可以拿走第i堆(ai⊕x)个石头,将局面变成a1⊕a2⊕…⊕an=0。如此重复,最后一定是先手面临最终没有石子可拿的状态。先手必败。

最后

以上就是洁净鼠标为你收集整理的博弈论-Nim游戏的全部内容,希望文章能够帮你解决博弈论-Nim游戏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(28)

评论列表共有 0 条评论

立即
投稿
返回
顶部