Wythoff Game - 威佐夫博弈


问题

两人轮流从苹果和梨子中取出水果,两堆水果的数量分别为(苹果)和(梨子)且

每人每次既可以从一堆水果中取任意个水果(至少取个),也可以从两堆水果中同时取任意个水果(至少取个),取的数量没有上限,最后一个把水果取光的人获胜。

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

解法

当我方面临局势时,我方必输,因为我方无法一次把两堆物品取光,且必然留给对方局势),对方可以一次将两堆物品取光;

当我方面临局势时,我方取时,留给对方局势,我方才赢;

当我方面临局势时,我方取时,留给对方局势,我方必赢。对于所有的局势,我方从两堆物品中同时取时必赢。

这样的局势看作棋盘上的坐标时,很像“皇后的棋步”(Queen's Move)。

WythoffGame1.png

上图中这些在虚线上的坐标,当我方面对这样的局势时必赢(称这样的局势为安全局势)。棋盘上关键的位置是红色的,这些是安全局势的边界点,当我方面临边界点时必输。

根据数学研究,这些边界实际是两条直线:

WythoffGame2.png

在二维坐标系上这两条直线的坐标计算方式是

其中常被称为“黄金比例”(Golden Ratio),也称“黄金分割”。黄金分割常数是一个无理数,任何正整数乘以或除以它,结果都不是整数。本问题中给定一个坐标时可以算出另一个黄金分割点的坐标,再向坐标系的外围方向取整,可以得到两条直线上安全局势的边界点。我们将二维坐标系上半边黄金分割线称为,黄金分割线称为

在下图中,当给定点,可以算出其与轴平行的直线与两条黄金分割线的四个交点

WythoffGame3.png

若点满足,则该点为安全局势,即处于黄金分割线区域内的一方必赢。

处于黄金分割区域,我方必赢;

处于黄金分割区域的边界点,我方必输,因为无论我方如何取物品,对方下一轮都会进入黄金区域;

处于其他区域时,我方需要取一个合适的数,将对方下一轮置于黄金分割区域的边界点,我方才赢;

当我方和对方都是高手时,只需一次计算即可分出胜负。该算法的时间复杂度为


Wythoff’s Game


源码

WythoffGame.h

WythoffGame.cpp

测试

WythoffGameTest.cpp