DFS-求迷宫最短路径和路径个数

测试用例:

//5 5     矩阵m n
//1 0     起点x y
//3 3     终点x y  
//2       障碍物个数 
//2 2     障碍物1坐标
//2 1     障碍物2坐标

import java.util.Scanner;

//5 5     矩阵m n
//1 0     起点x y
//3 3     终点x y  
//2       障碍物个数 
//2 2     障碍物1坐标
//2 1     障碍物2坐标
  
public class HWB {
    static int[][] move ={{0,-1},{-1,0},{0,1},{1,0}};
    static int minPath = 999999;
    static int minPathCount = 0;

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

        int[] startPoint = new int[2]; //起点
        startPoint[0] = in.nextInt();
        startPoint[1] = in.nextInt();
        map[startPoint[0]][startPoint[1]] = 1;

        int[] endPoint = new int[2];   //终点
        endPoint[0] = in.nextInt();
        endPoint[1] = in.nextInt();
        map[endPoint[0]][endPoint[1]] = 1;

        int lakeNum = in.nextInt();     //山湖个数

        for(int i = 0; i < lakeNum; i++){
            int row = in.nextInt();
            int col = in.nextInt();
            map[row][col] = 9;
        }

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }

        int path = 0;
        visited[startPoint[0]][startPoint[1]] = 1;
        dfs(startPoint[0],startPoint[1],endPoint,path,map,visited);
        dfs2(startPoint[0],startPoint[1],endPoint,path,map,visited);

        System.out.println("\n"+minPathCount+" "+minPath+"\n");

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                System.out.print(visited[i][j]+" ");
            }
            System.out.println();
        }
    }
    
    //求最短路径
    public static void dfs(int x, int y, int[] end,int path,int[][] map,int[][] visited) {
        //递归返回条件
        if(x==end[0] && y==end[1]){
            if(path<minPath){
                minPath = path;
            }
            return;
        }

        for(int i=0;i<move.length;i++){
            int moveX = x+ move[i][0];
            int moveY = y+ move[i][1];
            //越界判断
            if(moveX<0 || moveX>=map.length || moveY<0 || moveY>=map.length) continue;
            //判断是否有山湖(障碍物),和是否访问过
            if(map[moveX][moveY]!=9 && visited[moveX][moveY]!=1){
                visited[moveX][moveY] = 1;
                dfs(moveX,moveY,end,path+1,map,visited);
                visited[moveX][moveY] = 0;
            }

        }
    }

    //求最短路径个数
    public static void dfs2(int x, int y, int[] end,int path,int[][] map,int[][] visited) {
        //递归返回条件
        if(x==end[0] && y==end[1]){
            if(path==minPath){
                minPathCount++;
            }
            return;
        }

        for(int i=0;i<move.length;i++){
            int moveX = x+ move[i][0];
            int moveY = y+ move[i][1];
            //越界判断
            if(moveX<0 || moveX>=map.length || moveY<0 || moveY>=map.length) continue;
            //判断是否有山湖(障碍物),和是否访问过
            if(map[moveX][moveY]!=9 && visited[moveX][moveY]!=1){
                visited[moveX][moveY] = 1;
                dfs2(moveX,moveY,end,path+1,map,visited);
                visited[moveX][moveY] = 0;
            }

        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值