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