走迷宫——最短路径(DFS)

问题:求从起点走到终点的最短路径

Java代码:

  1 package com.lzp.maze.dfs;
  2 
  3 import java.util.Scanner;
  4 
  5 /**
  6  * @author LZP
  7  * @date 2021年4月3日
  8  * @Description
  9  * @version 1.0
 10  * 
 11  * 求走迷宫的最短路径(从起点走到终点)
 12  * 
 13  * 测试:
 14 
 15 5 5      
 16 0 0 1 0 0
 17 0 0 0 0 0
 18 0 0 1 1 0
 19 0 1 0 0 0
 20 0 0 0 0 0
 21 0 0      
 22 3 2      
 23 
 24 
 25  */
 26 public class MinPath {
 27     // 迷宫行数
 28     private static int n;
 29     // 迷宫列数
 30     private static int m;
 31     // 起点横纵坐标
 32     private static int startX, startY;
 33     // 终点横纵坐标
 34     private static int endX, endY;
 35     // 最短路径
 36     private static int minPath = Integer.MAX_VALUE;
 37     /**
 38      * 地图
 39      */
 40     private static int[][] map;
 41     
 42     /**
 43      * 访问数组 
 44      */
 45     private static int[][] visit;
 46     
 47     /*
 48      * 横坐标方向数组
 49      */
 50     private static int[] directX = {0, 1, 0, -1};
 51     
 52     /*
 53      * 纵坐标方向数组
 54      */
 55     private static int[] directY = {1, 0, -1, 0};
 56     
 57     /**
 58      * x 横坐标
 59      * y 纵坐标
 60      * step 当前走的步数
 61      */
 62     public static void dfs(int x, int y, int step) {
 63     if (x == endX && y == endY) {
 64         // 到达终点
 65         if (step < minPath) {
 66         minPath = step;
 67         }
 68         return;
 69     }
 70     
 71     /*
 72      * 规定走的顺序:顺时针走
 73      * 0 向右
 74      * 1 向下
 75      * 2 向左
 76      * 3 向上
 77      */
 78     
 79     for (int k = 0; k <= 3; k++) {
 80         int nextX = x + directX[k];
 81         int nextY = y + directY[k];
 82         // map地图,0 表示空地,1 表示障碍物
 83         // visit访问数组,0 表示没访问,1表示已访问
 84         if (nextX >= 0 && nextX < m && nextY >= 0 && nextY < n && map[nextX][nextY] == 0 && visit[nextX][nextY] == 0) {
 85         // 试探
 86         visit[nextX][nextY] = 1;
 87         // 递归
 88         dfs(nextX, nextY, step + 1);
 89         // 回溯
 90         visit[nextX][nextY] = 0;
 91         }
 92     }
 93     }
 94     
 95     public static void main(String[] args) {
 96     Scanner input = new Scanner(System.in);
 97     n = input.nextInt();
 98     m = input.nextInt();
 99     
100     map = new int[n][m];
101     visit = new int[n][m];
102     
103     // 初始化地图
104     for (int i = 0; i < n; i++) {
105         for (int j = 0; j < m; j++) {
106         map[i][j] = input.nextInt();
107         }
108     }
109     
110     // 初始化起点
111     startX = input.nextInt();
112     startY = input.nextInt();
113     // 初始化终点
114     endX = input.nextInt();
115     endY = input.nextInt();
116     
117     // 默认从起点开始,所以要将起点设置为已访问
118     visit[startX][startY] = 1;
119     
120     // 开始深度优先搜索
121     dfs(startX, startY, 0);
122     
123     if (minPath == Integer.MAX_VALUE) {
124         System.out.println("-1");
125     } else {
126         System.out.println(minPath);
127     }
128     }
129 }
View Code

 运行结果:

 

posted @ 2021-04-03 15:59  没有你哪有我  阅读(374)  评论(0编辑  收藏  举报