迷宫问题 最短路径(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 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
556 0
|
算法 Java 程序员
详解Java递归(Recursion)通过递归解决迷宫回溯及八皇后问题
详解Java递归(Recursion)通过递归解决迷宫回溯及八皇后问题
20441 0
详解Java递归(Recursion)通过递归解决迷宫回溯及八皇后问题
|
分布式计算 Java Hadoop
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
301 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
922 0
JAVA 实现上传图片添加水印(详细版)(上)
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
373 0
Java实现图书管理系统
|
Java Windows Spring
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
474 0
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
456 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
数据可视化 Java 容器
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
263 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
|
Java
Java实现拼图小游戏(7)—— 作弊码和判断胜利
当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
238 0
Java实现拼图小游戏(7)—— 作弊码和判断胜利