好吧我有点卡住了这个问题。遍历所有可能的移动
我有一个Puzzle对象,它有一个{1,2,3}的数组和一个表示目标{3,3,0}的数组,以及一个移动函数,它带有两个整数i & j并将其应用于阵列。
现在我正在尝试为此编写一个求解器。因此,我们的想法是,我们将所有可能的值应用于i & j,并继续应用它直到获得所需的目标。
我正在尝试使用递归方法来处理这个问题,但我无法理解的是如何阻止我的递归进入不同的方式,并找到让我到达目标的最佳“移动集”。
所以可能的移动列表:
(0,1), (0,2), (1,0), (1,2), (2,1), (2,0)
在每一次这些举动后,我们得到一个新的“金额数组”,我们需要将这些举动应用到那个,并检查它们中是否有任何结果在“目标数组”。
所以我的伪代码:
solve(puzzle):
if puzzle.isSolved: return true;
else:
solve(puzzle.move(0, 1));
solve(puzzle.move(0, 2));
solve(puzzle.move(1, 0));
solve(puzzle.move(1, 2));
solve(puzzle.move(2, 0));
solve(puzzle.move(2, 1));
- 我们假设puzzle.move函数返回新状态的谜题。
现在我确信我在这里做了一些可怕的错误..但我似乎无法把它放在手指上。所以任何想法/提示/指针将不胜感激。
谢谢。
编辑
好了,所以几件事情让这个大家更加清晰:
由于puzzle.move应用在移动后返回的困扰,我想创建一个新的难题,这样的递归经历了这一点。基本上,需要发生的是在每次移动之后,我们将有一个新的数组数组状态。 (a,b,a,c)的初始量为(a,b,c)的谜题有一个量(a = a,b + a,c)。我们比采取这个新的数组数组并应用下一步(i = 0,j = 2)等等。
但这只是“树”的一部分,还有另外一条需要检查的路径,即当我们对最初的数量应用移动(i = 0,j = 2),然后从那里继续。
希望这有助于:)
顺便说一句,这是问题被称为水壶问题(http://www.cut-the-knot.org/ctk/Water。SHTML)
感谢您的评论。我将尝试解释更多(在我的原始线程中,希望这也能帮助你):) – Obaid