java_迷宫BFS

迷宫算法BFS

import java.util.LinkedList;
import java.util.Scanner;

//迷宫BFS广度算法
//使用队列

public class maze_1 {
    static int[][] maze;
    static int x, y;//地图的大小
    static int[] addx={-1,1,0,0};//x向量增加量
    static int[] addy={0,0,-1,1};//y向量增加量
    //(-1,0)、(1,0)、(0,-1)、(0,1)想左,向右,向下,向上移动

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("输入地图的大小");
        x = in.nextInt();
        y = in.nextInt();
        maze = new int[x][y];
        System.out.println("输入地图");
        for (int i = 0; i < x; i++)
            for (int j = 0; j < y; j++)
                maze[i][j] = in.nextInt();
                //System.out.println(i+" "+ j+" "+maze[i][j]);
        System.out.println("输入入口,输入出口");
        int in_x = in.nextInt();
        int in_y = in.nextInt();
        int out_x = in.nextInt();
        int out_y = in.nextInt();
        System.out.println(BFS_1(in_x, in_y, out_x, out_y));
    }

    static int BFS_1(int x_1, int y_1, int out_x, int out_y) {
        LinkedList<Point> list = new LinkedList<Point>();
        Point point = new Point();
        point.setX(x_1);
        point.setY(y_1);
        point.setDis(0);
        list.add(point);
        maze[point.getX()][point.getY()]=1;
        while (!list.isEmpty()) {
            Point point_1 = list.getFirst();//取出第一个数
            System.out.println("("+point_1.getX()+","+point_1.getY()+")");
            list.removeFirst();//删除第一个数
            if(point_1.getX()==out_x&&point_1.getY()==out_y)
                return point_1.getDis();
            for(int i=0;i<4;i++ )
            {
                if(point_1.getX()+addx[i]<x && point_1.getX()+addx[i]>=0 && point_1.getY()+addy[i]<y &&
                point_1.getY()+addy[i]>=0 && maze[point_1.getX()+addx[i]][point_1.getY()+addy[i]]==0)
                    {
                        Point point_2=new Point();
                        point_2.setX(point_1.getX()+addx[i]);
                        point_2.setY(point_1.getY()+addy[i]);
                        point_2.setDis(point_1.getDis()+1);
                        maze[point_2.getX()][point_2.getY()]=1;//加入队列
                        list.add(point_2);
                    }
            }
        }
     return 0;
    }
}
class Point//节点
{
    private int x;//地图的x坐标
    private int y;//地图的有坐标
    private int dis;//在地图中需要的位置步数

    public int getDis() {
        return dis;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setDis(int dis) {
        this.dis = dis;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
}

//测试代码
1 0 1 0 1 1 1 1 1
1 0 0 1 0 0 1 0 1
1 0 0 1 1 0 0 0 1
1 0 1 0 1 0 0 1 1
1 0 0 0 0 1 0 0 1
1 1 0 1 0 1 0 0 1
1 0 0 1 0 1 0 0 1
1 1 0 1 0 0 0 0 1
1 1 1 1 1 1 1 1 1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Java迷宫问题的BFS算法,我可以给您提供以下思路: 1. 首先需要定义一个二维数组来表示迷宫,0表示可以通过的路,1表示障碍物; 2. 定义一个队列来存储待访问的节点; 3. 将起点加入队列,并将其标记为已访问; 4. 对于队列中的每个节点,分别向上、下、左、右四个方向进行探索,如果该方向上的节点未被访问过且可以通过,则将其加入队列,并标记为已访问; 5. 直到队列为空或者找到终点为止。 以下是Java代码实现: ```java import java.util.LinkedList; import java.util.Queue; public class MazeBFS { public static int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上下左右四个方向 public static boolean bfs(int[][] maze, int[] start, int[] dest) { int m = maze.length, n = maze[0].length; boolean[][] visited = new boolean[m][n]; // 标记是否访问过 Queue<int[]> queue = new LinkedList<>(); queue.offer(start); visited[start[0]][start[1]] = true; while (!queue.isEmpty()) { int[] cur = queue.poll(); if (cur[0] == dest[0] && cur[1] == dest[1]) { return true; } for (int[] dir : directions) { int x = cur[0] + dir[0], y = cur[1] + dir[1]; if (x >= 0 && x < m && y >= 0 && y < n && !visited[x][y] && maze[x][y] == 0) { queue.offer(new int[]{x, y}); visited[x][y] = true; } } } return false; } public static void main(String[] args) { int[][] maze = {{0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {1, 1, 0, 1, 1}, {0, 0, 0, 0, 0}}; int[] start = {0, 4}, dest = {4, 4}; System.out.println(bfs(maze, start, dest)); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值