迷宫解决最优无左转算法

时间:2011-04-09 22:35:03

标签: algorithm maze

我正在开展一个项目,我需要使用最少的右转弯数量并且没有左转弯来解决迷宫问题。

只要右转弯最小化,行驶距离就无关紧要了。我们被要求使用回溯算法和最佳(时间)算法来实现我们的程序。

对于回溯算法,我正在使用堆栈。我的算法类似于:

  • 将所有四个可能的起始方向推到堆栈上。
  • 走一条路,尽可能直奔。
  • 如果我们到达迷宫的尽头,则返回当前路径长度为最佳。
  • 如果我们到达最后一个可能的右转弯的死胡同,并采取它。
  • 如果当前路径长度大于当前路径长度,则返回到最后一个可能的右转弯并将其取下。

我想知道是否有人能指出我的最佳算法方向。

我很难想到比回溯更好的事情。

2 个答案:

答案 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的边缘到达的节点将被推到后面。