Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有障碍物的最短路径_Java_Algorithm_Graph Algorithm - Fatal编程技术网

Java 有障碍物的最短路径

Java 有障碍物的最短路径,java,algorithm,graph-algorithm,Java,Algorithm,Graph Algorithm,我们给出了N x N雷场(2d阵列),地雷所在的坐标在另一个M x 2阵列中给出。寻找从左上角到右下角的最短路径的最佳算法是什么,而无需踩到雷场中的地雷?这是一个问题,可以通过将问题简化为: 现在,当你有了图形,你需要应用一些最短路径算法 最简单的方法是(因为你的图表没有加权)。这 实现起来非常简单,并且总是能找到最快的路径,如果 这种情况是存在的 更复杂一点的方法是。在这里,您从开始节点(0,0)和结束节点(n,n)执行BFS,并在算法的两个前沿相互找到时完成。通过将第一条与第二条的相反方向

我们给出了N x N雷场(2d阵列),地雷所在的坐标在另一个M x 2阵列中给出。寻找从左上角到右下角的最短路径的最佳算法是什么,而无需踩到雷场中的地雷?

这是一个问题,可以通过将问题简化为:

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

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

如果你没有经验,我会从BFS开始,然后再转到更高级的algroithms

在伪代码中:

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()函数返回,该函数基本上遍历字典,直到找到“根”(即原始源节点)


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

欢迎访问该站点!记住一件事:你应该首先向我们展示你的算法,并指出不起作用的部分,以便在这里得到帮助。这是作业吗?应该这样写/标记。我会使用
A*
看这里如果你想要最好的算法,那么你应该根据什么方面/条件(性能、空间/时间复杂度、行数等)指定“最佳算法”是什么意思?最快,最少的代码,最易维护,最容易理解?Dijkstra的算法在这里是一个过度的杀伤力,因为图是不加权的。它比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)
getPath(dict, target):
   sol = [] //empty list
   curr = target
   while curr != None:
         sol.addFirst(curr)
         curr = dict.get(curr)