我正在开展一个项目,我需要使用最少的右转弯数量并且没有左转弯来解决迷宫问题。
只要右转弯最小化,行驶距离就无关紧要了。我们被要求使用回溯算法和最佳(时间)算法来实现我们的程序。
对于回溯算法,我正在使用堆栈。我的算法类似于:
我想知道是否有人能指出我的最佳算法方向。
我很难想到比回溯更好的事情。
答案 0 :(得分:7)
我认为你可以通过首先找到0转右转的所有点来做到这一点。然后右转1,依此类推。您可以使用队列来执行此操作。请注意,在第n阶段,您可以获得所有可以通过右转弯到达的点的最佳解决方案。更多 - 任何尚未到达的点都可通过>到达n点或根本不可达。为了实现最佳的时间复杂度,您必须使用以下事实:您只需要从那些到达的点搜索新的可到达点,这些点在适当的方向上具有未到达的邻居。由于每个点只有4个邻居,因此您只能搜索4次。您可以通过为每个方向D维护一个单独的列表来实现它,该方向包含在该方向上未到达的邻居的所有到达点。这为您提供了与迷宫区域成比例的时间复杂度,该区域与输入数据的大小成正比。
下面我将展示一个图形示例:
. . . . . . (0) . . . . . 0 1 1 1 1 (1) 0 1 1 1 1 1
. ####### . . 0 ########## . 0 ########## . 0 ########## 2
. # . # . . 0 # . # . . 0 # . # . . 0 # . # . (2)
. # . . . . 0 # . . . . 0 # . . . . 0 # . . . (2)
. #### . # . 0 #### . # . 0 #### . # . 0 #### . # 2
(.) . . . . . (0) . . . . . 0 1 1 1 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1 1
0 ########## 2 0 ########## 2
0 # . # 3 2 0 # 4 # 3 2
0 # (3) 3 3 2 0 # 3 3 3 2
0 #### . # 2 0 #### 4 # 2
0 1 1 (1) 1 1 0 1 1 1 1 1
( )
表示与相应的邻居未达到
答案 1 :(得分:4)
通过为迷宫中的每个位置构建四个节点来构建图形。每个节点将对应于特定方向:N,S,E,W。
每个节点和最多三个相邻的邻居之间会有边缘:“前”,“后”和“右”(如果它们存在)。通向“前”和“后”节点的边将具有权重0(因为路径长度无关紧要),而“右”中节点的边将具有权重1(这是代表的转弯的成本。)
一旦设置了图形(可能最好的方法是重用迷宫的原始表示),breadth-first search算法的修改变体将解决问题。
处理0/1边权重的技巧是使用deque而不是标准队列实现。具体来说,通过0个重量边缘到达的节点将被推到前端的前面,而通过重量1的边缘到达的节点将被推到后面。