bfs走迷宫


package com.itheima.Test;



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

class Point{
    int x;
    int y;
    int step;

    public Point() {
    }
}

public class _BFS走迷宫 {
    static int[][] map=new int[100][100];//地图
    static int[][] visit=new int[100][100];//访问过的
    static Queue<Point> queue=new LinkedList<>();//队列
    public static int[] dx={0,1,0,-1};//右、下、左、上
    public static int[] dy={1,0,-1,0};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int m,n;//行和列
        m=sc.nextInt();
        n=sc.nextInt();



        for(int i=1;i<=m;i++){
            for (int j = 1; j <=n ; j++) {
                map[i][j]=sc.nextInt();//填充地图
            }
        }
        int startx,starty;
        startx=sc.nextInt();
        starty=sc.nextInt();
        int p,q;//终点
        p=sc.nextInt();
        q=sc.nextInt();

        //bfs
        Point point =new Point();
        point.x=startx;
        point.y=starty;
        point.step=0;

        queue.offer(point);//将起点入队
        visit[startx][starty]=1;//从起点开始访问置为1


        while(!queue.isEmpty()){//队列不为空,或者没有可扩展的点
            int x=queue.peek().x;//取出队首的坐标
            int y=queue.peek().y;
            if(x==p&&y==q){
                //对于bfs来说,所有路径同时进行谁先找到就是最短路径
                System.out.println(queue.peek().step);
                break;
            }
            //如果没有走到终点就是4个方向走
            for(int k=0;k<3;k++){
                int tx,ty;
                tx=x+dx[k];
                ty=y+dy[k];
                //如果是没有障碍物并且没有访问过就入队
                if(map[tx][ty]==1&&visit[tx][ty]==0){
                    Point temp = new Point();
                    temp.x=tx;
                    temp.y=ty;
                    temp.step=queue.peek().step+1;

                    queue.offer(temp);
                    visit[tx][ty]=1;//设置已访问
                }
            }
            queue.poll();//拓展完了需要将队首元素出队
        }
    }
}

posted @ 2022-04-10 23:29  长情c  阅读(35)  评论(0)    收藏  举报