如何使用曼哈顿距离来解决这个游戏?

时间:2017-06-25 12:10:24

标签: algorithm dynamic-programming nim-game

每位玩家轮流从一篮子50个香蕉中取出1或2个香蕉。清空篮子的玩家获胜。

距离应该使用什么权重,矩阵大小应该是多少?每当有人采取行动时矩阵是否应该改变?如果玩家1的移动是水平的并且玩家2的移动是垂直的吗?

感谢您的阅读

2 个答案:

答案 0 :(得分:4)

我不确定您为什么特别想要使用动态编程和/或曼哈顿距离来解决这个难题。这是一款可以找到固定解决方案的游戏。

如果你先去,有3个香蕉,无论你玩什么,我都会赢。你选一个,我选两个,反之亦然。如果有六个香蕉,同样的逻辑允许我将游戏减少到3香蕉的情况。事实上,对于任何3n香蕉,我可以将游戏减少到3(n-1)个香蕉。如果香蕉的数量不是三的倍数,那么你可以把它变成三的倍数(通过去掉一个或两个香蕉),并确保胜利。

对于k香蕉,你总是删除k % 3。如果k % 3 == 0,除非你的对手犯了错误,否则你输了,所以你可以随心所欲地玩。那就是它。

答案 1 :(得分:1)

我同意@pdpi,但如果你坚持用动态编程来解决这个问题,那么你应该这样做:

f(left_in_the_basket, mine)
    if left_in_the_basket is 2 && turn is mine:
        return 1
    if left_in_the_basket is 1 && turn is mine:
        return 1
    if left_in_the_basket is 2 && turn is not mine:
        return -1
    if left_in_the_basket is 1 && turn is not mine:
        return -1
    return max (f(left_in_the_basket - 1, not mine), f(left_in_the_basket - 2, not mine))