Nim Game - 尼姆博弈


问题

两人轮流从堆物品中取出一些物品,堆物品的数量分别为(所有物品数量都是正整数)。

每人每次从一堆物品中至少取个,多则不限,最后取光所有物品的人获胜。

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

解法

当我方面临局势(有堆物品)时,我方必赢,因为我方可以一次把剩下一组的物品取光;

当我方面临局势(有堆物品且均剩个)时,我方必输,因为我方必然留给对方只剩堆物品的局势;

当我方面临局势(有堆物品且均剩个)时,我方必赢,因为我方必然留给对方只剩堆物品且均剩个的局势;

当我方面临局势时,暂时无法看出我方是否必赢;

本问题背后的数学模型叫,堆数组大小的二进制和,上面个局势可以转化为:

可以看出,当我方面临局势时必赢,否则必输。

该算法时间复杂度为


Nim Sum


源码

NimGame.h

NimGame.cpp

测试

NimGameTest.cpp