美文网首页
迷宫最短路径

迷宫最短路径

作者: packet | 来源:发表于2019-04-09 16:18 被阅读0次

一道经典的迷宫题,在一个 m * n 的图中,找出某两个点的最短路径。

public class Path {

    private int[][] maze;
    private int[][] offset;

    public Path(int m, int n) {
        this.maze = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++)
                maze[i][j] = ThreadLocalRandom.current().nextInt(2); // 0表示障碍
            System.out.println(Arrays.toString(maze[i]));
        }

        this.offset = new int[][] {
                {-1, 0},
                {1, 0},
                {0, -1},
                {0, 1}
        };

    }

    public void bfs(int x, int y) {
        if (maze[x][y] == 0) {
            throw new RuntimeException("no access");
        }
        int m = maze.length;
        int n = maze[0].length;
        Deque<Integer> queue = new LinkedList<>();
        int[][] distinct = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++)
                distinct[i][j] = -1;
        }
        distinct[x][y] = 0;
        int[][] vis = new int[m][n];
        queue.addLast(x * n + y);
        vis[x][y] = 1;
        Integer element;
        while ((element = queue.poll()) != null) {
            int p = element / n;
            int q = element % n;
            for (int i = 0; i < 4; i++) {
                int a = p + offset[i][0];
                int b = q + offset[i][1];
                if (a >= 0 && a < m && b >= 0 && b < n && maze[a][b] == 1 && vis[a][b] == 0) {
                    vis[a][b] = 1;
                    distinct[a][b] = distinct[p][q] + 1;
                    queue.addLast(a * n + b);
                }
            }
        }

        System.out.println("-----------------------------");
        for (int[] ints : distinct) {
            System.out.println(Arrays.toString(ints));
        }
        System.out.println("-----------------------------");

    }

    public static void main(String[] args) {
        Path path = new Path(8, 7);
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextInt()) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            path.bfs(x, y);
        }

    }
}
  1. 采用的是BFS算法,需要一个队列,队列里的元素是整数,注意怎么和二维数组的坐标对应起来。
  2. 注意起点坐标x, y是怎么输入的

相关文章

  • 迷宫最短路径

    一道经典的迷宫题,在一个 m * n 的图中,找出某两个点的最短路径。 采用的是BFS算法,需要一个队列,队列里的...

  • 迷宫最短路问题

    题面   简单看一遍题就清楚就很清楚是走迷宫+记录最短路径的问题。难点大概就是 1.dfs遍历一遍去找到最短的路...

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • 【算法常用模板】总结(更新中)

    搜索类 图类 排序类 并查集 数学类 位运算 Part1 搜索类 bfs 求迷宫问题最短路径(未验证) dfs 求...

  • Yen的K条最短路径算法(KSP)

    一、问题介绍 1.求K条最短路径的必要性 最短路径问题分为: 单源最短路径 所有顶点对间的最短路径 共同的缺陷:这...

  • [图]BFS应用之迷宫问题

    一般迷宫类问题(求最短路径)均可用BFS求解 1. 网易 地牢逃脱 给定一个 n 行 m 列的地牢,其中 ‘.’ ...

  • 最短路径算法

    最短路径算法可以分为两类:单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任...

  • 最短路径 之 Dijkstra 算法

    • 最短路径 之 Floyd 算法• 最短路径 之 Bellman 算法 Dijkstra算法是用于求解单源最短路...

  • 数据结构第二季 Day11 图 Kruskal算法、Dijkst

    一、最短路径基础知识 1、最短路径的定义是什么? 最短路径(Shortest Path):两顶点之间权值之和最小的...

  • 图 求解最短路径 时间复杂度 空间复杂度 单源最短路径 多源最短路径 条数最短(点权为1) 边权之和最小或最大(花...

网友评论

      本文标题:迷宫最短路径

      本文链接:https://www.haomeiwen.com/subject/nxhiiqtx.html