Nim游戏详解

部(xu)分(duo)材料摘自百度百科

定义

Nim游戏:通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

P局面与N局面:P代表Previous,N代表Next。所谓P局面,简单点讲即在这个局面的人必败,而N局面相反。

性质

这里写得简单一点,应该不难懂

①:从当前局面出发,能够转移成为P局面的就是N局面。

②:从当前局面出发,不论如何取都是N局面的就是P局面。

③:不能移动的局面就是P局面(废话)

判断方法

判断一个局面是P/N的方法有很多。一般能想到的是递归。对于一个局面,递归处理其子局面。如果有至少一个是P局面,那么当前局面就是N局面。否则就是P局面。

但是这些递归会有很多重复计算,于是我们就可以考虑记忆化搜索,把每次的结果存起来,就可以大大减小时间复杂度。

Nim游戏结论

但是,不论怎么优化,时间复杂度总是不会优于 O(ni=1ai) ,仍然是很大的。于是这时,一个伟大的结论出现了:

对于一个Nim游戏的局面(a1,a2,…,an),它是P局面当且仅当a1^a2^…^an=0

证明

这是为什么啊??根本无法理解!一个博弈论问题咋和位运算扯上关系了??

别急,我们慢慢来证明它:

证明这个结论,其实我们只需要证明三个东西:

①:这个结论把所有的最终状态判定为P局面。

②:根据这个结论,被判为N局面的状态一定可以移动到P局面。

③:根据这个结论,被判为P局面的状态一定不能够移动到P局面。

证明
对于①:最终状态只可能是一个:所有石子均被取完。此时异或和为0。

对于②:不妨设a[1]^a[2]^······^a[n]=k,k的二进制最高位为第p位。那么一定存在某个a[i],它的二进制下的第p位是1。此时必然存在k^a[i] < a[i](因为k的最高位被异或掉了)。那么我们取到使得a[i]=k^a[k],则总异或值变为(k^a[i])^(k^a[i])=0。

对于③:假设把a[i]取成a[j]时仍然满足异或和=0,那么a[1]^a[2]^······^a[i]^······a[n]=a[1]^a[2]^······^a[j]^······a[n]。两边消去后可得a[i]=a[j]。此时即为不取石子,不合法。因此③成立。

综上,该结论成立。

应用

知道了这个结论,我们就可以 O(n) 判断一个局面的状态,也可以 O(n) 求出当前局面必胜策略的数目。于是Nim游戏的套路就被摸透啦!

你可能感兴趣的:(算法/总结/游记,博弈论---Nim游戏,蒟蒻zxl的Blog专栏)