迷宫问题 最短路径(Java)实现

简介: 迷宫问题指的是:在给定区域内,找到一条甚至所有从某个位置到另一个位置的移动路线。

迷宫问题利用java的宽度优先搜索实现寻找最短路径

题目描述:

 int[][] map= { {0, 1, 0, 0, 0},
                {0, 0, 0, 1, 0},
                {1, 1, 0, 0, 0},
                {0, 0, 0, 0, 1},
                {0, 0, 0, 0, 0}};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

求最短路径问题:
不能直接用队列,需要用到数组模拟队列,去保存每个点的前一个点.

下面是具体的代码实现.

下面的代码可以实现从地图上任意起点开始,到指定终点的最短路径,代码的具体功能代码里面注释的很清楚了:
import java.util.Scanner;

public class Test {

    //地图的大小
    static int n = 5;
    static int m = 5;
    //用来保存地图
    static int[][] map;
    //用来保存是否被访问过
    static int[][] isVisited = new int[n][m];
    //遵循 左下右上 的顺序走
    static int[][] trval = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
    //利用数组模拟队列
    static Node[] nodes = new Node[n * m];
    //判断是否已经到达终点
    static boolean flag = false;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        map = new int[][]{
                {0, 1, 0, 0, 0},
                {0, 0, 0, 1, 0},
                {1, 1, 0, 0, 0},
                {0, 0, 0, 0, 1},
                {0, 0, 0, 0, 0}};
        System.out.print("请输入起点坐标:");
        int start_x = sc.nextInt();
        int start_y = sc.nextInt();
        System.out.print("请输入终点坐标:");
        int end_x = sc.nextInt();
        int end_y = sc.nextInt();

        bfs(start_x, start_y, end_x, end_y);


    }


    //传进来起点的x,y的起点和终点坐标
    static void bfs(int x, int y, int end_x, int end_y) {
        //判断要查询的起点和终点坐标 是否在地图上
        if (!isStandard(x, y) || !isStandard(end_x, end_y)) {
            System.out.println("输入的坐标有误~~~");
            return;
        }

        //当前第几个元素
        int head = 0;
        int index = 0;

        isVisited[x][y] = 1;
        nodes[head] = new Node(x, y, -1);
        int next_x;
        int next_y;
        while (!flag) {

            for (int i = 0; i < trval.length; ++i) {
                next_x = nodes[head].x + trval[i][0];
                next_y = nodes[head].y + trval[i][1];

                if (isStandard(next_x, next_y)) {
                    isVisited[next_x][next_y] = 1;
                    nodes[++index] = new Node(next_x, next_y, head);
                }
                if (next_x == end_x && next_y == end_y) {
                    flag = true;
                    break;
                }
            }
            head++;
        }

        //打印走过的路径
        System.out.println("走过的路径坐标为:");
        printTrval(--head);
        System.out.println("终点");

    }

    //判断这个点是否超出地图范围
    static boolean isStandard(int x, int y) {
        if (x < n && x >= 0 && y >= 0 && y < m && map[x][y] == 0 && isVisited[x][y] == 0) {
            return true;
        }
        return false;
    }

    //打印走过的路径
    static void printTrval(int index) {
        if (nodes[index].pre == -1) {
            System.out.print("[" + nodes[index].x + "," + nodes[index].y + "]-->");
        } else {
            printTrval(nodes[index].pre);
            System.out.print("[" + nodes[index].x + "," + nodes[index].y + "]-->");
        }
    }


}

//用来保存每个结点以及前一个结点
class Node {
    int x;
    int y;
    int pre;

    public Node(int x, int y, int pre) {
        this.x = x;
        this.y = y;
        this.pre = pre;
    }
}
目录
相关文章
|
定位技术
Java-老鼠出迷宫(递归)
Java-老鼠出迷宫(递归)
72 0
|
24天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
60 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
6月前
|
存储 Java
Dijkstra最短路径(Java)(详细+模板)
Dijkstra最短路径(Java)(详细+模板)
51 4
|
28天前
|
Java
【Java】蚂蚁迷宫问题
【Java】蚂蚁迷宫问题
11 0
|
4月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
58 3
|
5月前
|
算法 Java
Java数据结构与算法:最短路径算法
Java数据结构与算法:最短路径算法
|
5月前
|
Java
迷宫回溯(java)
迷宫回溯(java)
|
5月前
|
算法 Java 定位技术
Java数据结构与算法:贪心算法之最短路径
Java数据结构与算法:贪心算法之最短路径
|
5月前
|
XML Java 数据格式
走出Java资源加载的迷宫
走出Java资源加载的迷宫
25 0
|
5月前
|
Java
P9242 [蓝桥杯 2023 省 B] 接龙数列JAVA,边权为1的最短路问题,洛谷P9242 [蓝桥杯 2023 省 B] 接龙数列​编辑力扣1926.迷宫离入口最近的出口力扣433.
P9242 [蓝桥杯 2023 省 B] 接龙数列JAVA,边权为1的最短路问题,洛谷P9242 [蓝桥杯 2023 省 B] 接龙数列​编辑力扣1926.迷宫离入口最近的出口力扣433.