【问题标题】:Shorthest path with obstacles有障碍物的最短路径
【发布时间】:2015-05-28 14:43:09
【问题描述】:

给定 N x N 雷区(二维数组),地雷所在的坐标在另一个 M x 2 数组中给出。在不踩雷区的地雷的情况下,找到从左上角到右下角的最短路径的最佳算法是什么?

【问题讨论】:

  • 欢迎来到本站!要记住的一件事:您应该始终首先向我们展示您的算法并指出无法正常工作的部分,以便在这里获得帮助。
  • 这是作业吗?应该这样写/标记。我会使用A* 看这里stackoverflow.com/q/23705233/2521214 如果你想要最好的算法,那么你应该根据哪些方面/条件(性能、空间/时间复杂度、行数……)指定
  • “最佳算法”是什么意思?最快、最少代码、最易维护、最容易理解?

标签: java algorithm graph-algorithm


【解决方案1】:

这个问题可以用dijkstra算法来解决。 首先删除所有到我的节点的传入路径,然后继续到右下角节点的最短路径。

【讨论】:

  • Dijkstra 的算法在这里是多余的,因为该图未加权。它比 BFS 更难实现,效率也更低,这也是这里的最佳选择。
【解决方案2】:

这是一个shortest path problem,可以通过将问题简化为graph来解决:

G=(V,E)
V = { (x,y) | for all x,y such that (x,y) is not a mine } 
E = { ((x1,y1),(x2,y2)) | (x1,y1) is adjacent to (x2,y2) }

现在当你有了图表,你需要应用一些最短路径算法。

  • 最简单的是BFS(因为您的图表未加权)。这 实现起来非常简单,并且总是找到最快的路径,如果 这样的存在。
  • 更复杂一点的方法是bi-directional BFS。在这里,您从开始节点 (0,0) 和结束节点 (n,n) 执行 BFS - 并在算法的两个前沿找到彼此时完成。通过将第一个与第二个的反向连接来给出路径。这种方法可能比常规 BFS 更快,但更难编程。
  • 您可以使用通知算法,例如A* search algrotihm,将曼哈顿距离作为启发式函数(假设您只能向上/向下/向右/向左移动,没有对角线)。这可能会比这两种方法都快,但更难编码。

如果您没有 BFS 经验,我会从 BFS 开始,然后再转向更高级的算法。

在伪代码中:

BFS(x_source,y_source, x_target,y_target):
   queue = empty new queue
   queue.add(Pair(x_source,y_source))
   parent= new dictionary
   parent.add(source, None)
   while (queue.empty() == false): 
      curr = queue.dequeue()
      currX = curr.first
      currY = curr.second
      if (currX == x_target && currY == y_target)
          return getPath(dict, curr)
      for each neighbor u of curr: //u is a pair of (x,y) coordinates of adjacent cell
          if u is not a key in parent:
             parent[u] = curr
             queue.add(u)

上面的BFS填充了parent字典,路径由下面的getPath()函数返回,基本上是遍历字典,直到找到“根”(也就是原来的源节点)。

getPath(dict, target):
   sol = [] //empty list
   curr = target
   while curr != None:
         sol.addFirst(curr)
         curr = dict.get(curr)

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2011-08-25
    相关资源
    最近更新 更多