每位玩家轮流从一篮子50个香蕉中取出1或2个香蕉。清空篮子的玩家获胜。
距离应该使用什么权重,矩阵大小应该是多少?每当有人采取行动时矩阵是否应该改变?如果玩家1的移动是水平的并且玩家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))