java - 如何使用广度优先搜索找到迷宫中的最短路径?

标签 java shortest-path breadth-first-search

我意识到这个问题已经被问过好几次了,但我只是想了解如何将其放在上下文中。我试图找出如何使用广度优先搜索在迷宫中找到最短路径。我得到了一个创建迷宫的程序,我正在尝试找到穿过它的最短路径。

package solver;

import java.awt.Point;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class BreadthFirstSearch extends AbstractSolver {  

    @Override
    public List<Point> solve(int[][] maze, Point start, Point goal) {
        LinkedList<Point> path = new LinkedList<Point>();
        List<Point> prevPoints = new LinkedList<Point>();
        Queue<Point> agenda = new LinkedList<Point>();
        List<Point> visited = new LinkedList<Point>();

        agenda.add(start);
        visited.add(start);

        while(!agenda.isEmpty()) {
            Point current = agenda.remove();

            for(Point neighbour : getNeighbours(current, maze)) {
                if(!visited.contains(neighbour)) {

                    visited.add(neighbour);
                    agenda.add(neighbour);

                }
            }
        }
        return null;
    }

}

我正在尝试找出将父节点连接到子节点的方法,以便我可以将连接追溯到起点并返回路径。

最佳答案

广度优先搜索可能不是查找最短路径 ( See Dijkstra's shortest path algorithm ) 的最有效方法。但如果您坚持,我想您会想要为每种可能的路径配置创建一个列表,然后选择最短的一个。

当然,这将是很多路径!你能做的就是基于 bfs 实现你自己的 Dijkstra 算法(实际上,它一开始就是基于 bfs 的)。这大致需要创建您自己的点类并添加一个名为 next 的字段,该字段指向您的下一个点,并且每次访问未探索的点时,您都​​会更新到该点的最短路径。详情请访问wiki或search it up on Youtube (维基百科有时很难理解,但是那里的伪代码非常有用;)!

关于java - 如何使用广度优先搜索找到迷宫中的最短路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711127/

相关文章:

java - ListItem焦点改变

供应商 Applet 中的 Java 区域设置问题

通过 Dijkstra 算法从每个节点作为源计算到所有节点的最短路径时,Java 内存不足堆错误

algorithm - 统一成本搜索项目 euler #81

python - 三字母词广度优先搜索,优化

java - 设置比较器不是通用的;它不能用参数参数化

algorithm - A* 启发式 : Shortest path passing once in multiple points

algorithm - 我们可以在每个顶点上使用 BFS 来找到图形的直径吗?如果是这样,这是最好的解决方案吗?

c++ - 相同方法的两个相同实现,为什么一个比另一个快得多?

java - 为 JSON 响应中的字段选择数据类型