bfs走迷宫最短路径

package com.itheima.Test;

import java.util.Scanner;
/*
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
*/
public class _dfs走迷宫 {
    private static int p,q,min=999999;//p,q代表终点坐标
    static   int[][] map=new int[60][60];//1代表空地,2代表障碍物
    static   int[][] visit=new int[60][60];//0表示未访问过,1表示访问过
    public static void  dfs(int x,int y,int step){//x,y是坐标,step是步数
        if(x==p&&y==q){//如果到达终点就更新最短路径的值和回溯
            if(step<min){
                min=step;//更新最短路径
            }
            return ;//回溯
        }
        //向右
        if(map[x][y+1]==1&&visit[x][y+1]==0){//不是障碍物点并且没有走过
            //说明可以走
            visit[x][y+1]=1;
            dfs(x,y+1,step+1);//向右试探
            visit[x][y+1]=0;//每次走完访问标记置为0,以便下次路径的比对
        }
        //向下
        if(map[x+1][y]==1&&visit[x+1][y]==0){
            visit[x+1][y]=1;
            dfs(x+1,y,step+1);
            visit[x+1][y]=0;

        }
        //向左
        if(map[x][y-1]==1&&visit[x][y-1]==0){
            visit[x][y-1]=1;
            dfs(x,y-1,step+1);
            visit[x][y-1]=0;

        }
        //向上
        if(map[x-1][y]==1&&visit[x-1][y]==0){
            visit[x-1][y]=1;
            dfs(x-1,y,step+1);
            visit[x-1][y]=0;
        }
        return ;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();//行
        int n=sc.nextInt();//列


        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <=n; j++) {
                map[i][j]=sc.nextInt();
            }
        }

        int startx=sc.nextInt();//开始坐标
        int starty=sc.nextInt();


         p=sc.nextInt();//终点坐标
         q=sc.nextInt();

         visit[startx][starty]=1;//开始的地方访问标记置为1

        dfs(startx,starty,0);
        System.out.println(min);//输出最短路径


    }
}

posted @ 2022-04-10 18:32  长情c  阅读(43)  评论(0)    收藏  举报