这最终是具有某些修改的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来利用这种情况来发挥自己的优势。输了。
但是这种方法在某些未知的测试用例中失败,是否有更好的方法来找到获胜者,或者是否有其他违反这种逻辑的测试用例。
答案 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 )。一旦解决了这六个较小的游戏,如果其中一个对我来说是获胜的游戏,那么我会采取相应的行动并赢得比赛。
还有一个参数,该参数是谁。这使可解决问题的规模增加了一倍。
关键是找到所有可能的动作,并为每个动作重复执行,以存储已经解决的游戏以提高效率。
需要自然地找出基本情况。