寻找改良Nim的更好方法

时间:2019-05-06 18:35:31

标签: algorithm game-theory

这最终是具有某些修改的nim游戏。

规则如下:

有两个玩家A和B。

游戏进行了两堆比赛。最初,第一堆包含N个比赛,第二堆包含M个比赛。

玩家交替轮流; A先玩。

当前回合中,当前玩家必须选择一个堆并从中删除正数的比赛(不超过该堆上当前的比赛数)。

如果另一堆中的火柴数除以X,则只能从堆中删除X个火柴。

从所有筹码中拿出最后一场比赛的玩家获胜。

两个球员都发挥得最好。

我的评价:

让我们说我们有两个堆27。我们有3个案例将第二个堆减少为wiz:2 1,2 3,2 5如果A处于最佳比赛状态,他/她将获得2 3,因此唯一B留下的机会是2 1,然后A可以取得0 1并赢得比赛。解决方案的核心是,如果A或B遇到任何可能在下一步直接损失的情况,那么它将尽力避免这种情况,并通过在此之前离开状态1来利用这种情况来发挥自己的优势。输了。

但是这种方法在某些未知的测试用例中失败,是否有更好的方法来找到获胜者,或者是否有其他违反这种逻辑的测试用例。

1 个答案:

答案 0 :(得分:1)

这是经典的动态编程问题。首先,找到用较小游戏描述游戏结果的递归关系。这里的参数是X和Y,其中X是一个堆栈中的匹配数,而Y是另一个堆栈中的Y。如何减少这个问题?

好吧,假设轮到我进行X个匹配,并假设Y可被数字a1,a2和a3整除,而x可被b1,b2,b3整除。然后,我有六个转弯。问题减少到解决(X-a1,Y)(X-a2,Y)(X-a3,Y),(X,Y-b1),(X,Y-b2),(X,Y-b3 )。一旦解决了这六个较小的游戏,如果其中一个对我来说是获胜的游戏,那么我会采取相应的行动并赢得比赛。
还有一个参数,该参数是谁。这使可解决问题的规模增加了一倍。
关键是找到所有可能的动作,并为每个动作重复执行,以存储已经解决的游戏以提高效率。

需要自然地找出基本情况。