BashGame 巴什博弈

问题

AABB两人轮流从nn个物品中取出物品,每次取的物品数限定为(1p)(1 - p)(至少取11个,至多取pp个。n,pn, p都是正整数且p<np \lt n,显然若pnp \ge n则第一个取的人一次就可以把所有物品取走从而获胜)个,最后一个把物品取光的人获胜。

给定nnpp,当我方先手,我方和对方都是高手(在能赢的情况下一定能赢),求我方是否能赢。

巴什博弈还可以描述为:AABB两人轮流向一个篮子中放入物品,篮子最多能放nn个物品。每次放的物品数量限定为(1p)(1 - p),最后一个把篮子填满的人获胜。

上面两个问题其实是相同的,只是放和取的过程相反。本章中其他的博弈问题都可以像这样用相反的过程进行颠倒。

解法

n=p+1n = p + 1AA(1p)(1 - p)个物品,剩下(1p)(1 - p)个物品。下一次BB总能一次取光,BB获胜。

介绍博弈论中的概念“局势”,当一方做选择时,剩余的物品数量为xx时,称这一方面对的局势为(x)(x)。对于n=50,p=4n = 50, p = 4的情况:

(1)(1) 当我方面临(14)(1 - 4)局势时,我方必赢,因为我方可以将剩余物品都拿光;

(2)(2) 当我方面临(5)(5)局势时,我方必输,因为我方取物品后,必然留给对方(04)(0 - 4)局势,对方必赢;

(3)(3) 当我方面临(69)(6 - 9)局势时,我方必赢,因为我方可以留给对方(5)(5)局势,对方必输;

\cdots

可以看出,当留给对方p+1p + 1个物品时,下一轮对方必然会输,因为对方必然取(1p)(1 - p)个物品,留给我方(1p)(1 - p)个物品。称这样的物品数量为必赢数量w=p+1w = p + 1

当我方取物品时面对ww的倍数个物品时,我方必输,即nmod(p+1)=0n \mod (p + 1) = 0。否则对方必输。

该算法的时间复杂度为O(1)O(1)

源码

BashGame.h

BashGame.cpp

测试

BashGameTest.cpp

Last updated