Java 迷宫保存路径

GA666666 2021-05-24 PM 17℃ 0条

前两天写的 迷宫算法是依据bfs算法最后把数组进行修改,最后得出路径看着比较直观。但实际问题往往不需要输出整个数组,而是选择的路径,所以要使用dfs结合队列进行存储路径
代码:

import java.util.LinkedList;
import java.util.Queue;

//定义Postion类主要是为了存储路径
class Postion {
    int x, y;
    public Postion(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }
}

public class T1 {
    //因为要使其他静态方法访问变量,所以这里设置为静态变量
    //迷宫地图
    static int[][] maze = { 
        { 0, 1, 0, 0, 0, 0 }, 
        { 0, 0, 0, 1, 0, 0 },
        { 0, 0, 0, 1, 0, 0 },
        { 0, 0, 1, 0, 0, 1 }, 
        { 1, 1, 0, 0, 0, 0 } };
    //方向
    static int[][] step = { { 1, 0 }, { 0, 1 }, { 0, -1 }, { -1, 0 } };
    //dfs所需要的队列
    static Queue<Postion> q = new LinkedList<Postion>();
    //用于存储走过的路径
    static Queue<String> res = new LinkedList<String>();
    //是否走过
    static boolean[][] flags = new boolean[maze.length][maze[0].length];

    public static void main(String[] args) {
        //添加起始点的信息
        q.add(new Postion(0, 0));
        flags[0][0] = true;
        res.add("");
        //开始dfs
        while (!q.isEmpty()) {
            //获取队头信息,而不出队
            int x = q.peek().x;
            int y = q.peek().y;
            //截止条件
            if (x == maze.length - 1 && y == maze[0].length - 1) {
                //注意这里输出的是 res.peek(),res下存储很多条路径,符合条件就会输出当前的路径
                System.out.println(res.peek());
                break;
            } else {
                //四个方向
                for (int i = 0; i < 4; i++) {
                    //判断要访问的点是否符合要求
                    check(x + step[i][0], y + step[i][1]);
                    //符合的情况下,修改变量已经整合到check方法中
                }
            }
            //出队进行下一次循环
            q.poll();
            res.poll();
        }
        
        //以下是进行地图的输出
        String result = res.peek();
        String[] pos = result.split(" ");
        for (String string : pos) {
            String[] nums = string.replace("(", "").replace(")", "").split(",");
            int x = Integer.parseInt(nums[0]);
            int y = Integer.parseInt(nums[1]);
            maze[x][y] = 2;
        }
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[0].length; j++) {
                System.out.print(maze[i][j] + " ");
            }
            System.out.println();
        }

    }

    private static void check(int i, int j) {
        //验证要访问的点:是否越界、是否已经访问,是否是墙壁
        if (i >= 0 && i < maze.length && j >= 0 && j < maze[0].length
                && !flags[i][j] && maze[i][j] == 0) {
            //符合要求,将结点加入队列,修改访问状态
            q.add(new Postion(i, j));
            flags[i][j] = true;
            //这里比较有趣,add了res.peek,所以每次加入的路径包含队头
            //check后会将队头出队,这要保证了不会吧所有的路径都进行保留
            res.add(res.peek() + "(" + i + "," + j + ") ");
        }

    }

}

运行截图:请输入图片描述

标签: none

非特殊说明,本博所有文章均为博主原创。

上一篇 Java 迷宫问题
下一篇 Java读取txt

评论啦~