走迷宫——最短路径(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 }
运行结果: