java MiniMax返回反向实用程序值
我正在打印Mini Max的访问状态和实用性。 当值从终端状态返回到其根时,我遇到了问题,从而导致我访问的状态实用程序值中的4个不正确。我只是不知道是什么原因导致了这个错误。我很确定我的最小值和最大值方法是正确的
你可以在下面搜索框中键入要查询的问题!
我正在打印Mini Max的访问状态和实用性。 当值从终端状态返回到其根时,我遇到了问题,从而导致我访问的状态实用程序值中的4个不正确。我只是不知道是什么原因导致了这个错误。我很确定我的最小值和最大值方法是正确的
# 1 楼答案
对于列表中的第一个状态,您需要解释为什么
ooxxxo-xo
应该是1。如果我以我认为应该的方式重新写下这篇文章,那么州会这样写:如果我们正确地将
x
作为下一步,我们将得到正确的答案。所以,问题可能出在你们这一代人身上看看这个,你有一个静态数组来存储移动,但是当你进行递归调用时,你会一次又一次地覆盖这些移动。相反,每次递归调用都需要移动的本地副本。因此,将
minChildren
和maxChildren
的定义移动到MinTurn
和MaxTurn
应该至少解决代码中的一个问题。(我还没有确认没有其他问题。)明确地说,您的调用堆栈是这样的:
当到达标记为
B
的行时,将覆盖在A
行计算的maxChildren。因此,当程序返回到A
时,可用的移动将被覆盖,并且可能与之前预期的不同在解决了这个问题之后,我相信你的新问题就在于你打印东西的方式。如果查看打印代码,则记录当前的最大值,而不是子项返回的值:
因此,在标记为B的行中,您正在为迄今为止看到的所有儿童打印^{)。如果想查看子项的值,不应立即在A行中获取最大值,而是存储结果并记录。然后,拿最大值
你在这种状态下遇到了麻烦:
这是从父状态打印的,搜索可能从该状态开始:
第一步是把x放在左下角,这将赢得比赛,并给出1的值。当应用第二个移动时,在中间出现X的状态,Max值仍然是前一个移动的1。p>
您的代码应该如下所示: