【发布时间】:2014-05-17 14:57:14
【问题描述】:
我试图通过创建一种从迷宫中找到出路的算法来理解递归回溯。所以这是我的“回溯”逻辑:
1) 从当前位置确定您之前未去过的所有开放位置:上、下。 (左右可能被一堵墙挡住了,也可能以前去过)
2) 如果amtOfOpenLocations >= 1 随机选择一个openLocation 并移动到那里。
3) (递归调用)如果没有出错,重复 #1 直到到达路径输出或基本情况。
4) 如果amtOfMoveLocations < 1 后退一步,直到其中一个移动有一个可用的移动位置,不同于已经进行的任何移动。重复步骤 1-3。
所以我的第一个问题是:这是回溯算法的正确实现吗?
如果我的逻辑是正确的,这是我的下一个问题:
所以基本上我所做的就是不断检查已经制作好的位置以外的位置,直到找到出路。当我找到出路时,我会忽略所有其他可能的动作并返回解决方案。例如,如果我在位置 (4,4) 并且我的位置 (4,3), (4,5), (5,4), (3,4) 都可以作为 openLocations 使用,我是对这些位置中的每一个位置进行 4 次递归调用,还是只对其中任何一个位置进行一次递归调用并且逐个测试每个位置?
我的书说“如果您不在出口点,请进行 4 次递归调用以检查所有 4 个方向,并提供 4 个相邻单元格的新坐标。”
* 上关于类似问题的answer 说:“每次迭代多次移动......是错误的” 因此,我很困惑。我的书是错的还是什么?
最后,防止我之前已经检查过的位置的最佳方法是什么?我的想法是保留一个临时数组,其中所有访问过的位置都标有“!”而我的getMoveLocations() 方法将避免任何带有“!”的单元格。有没有更好的方法或者我的方法可以接受?
【问题讨论】:
标签: java algorithm recursion backtracking maze