1.题目解析
一个矩阵里面.表示路,*代表墙,指定一个起点和一个终点,让你求起点到终点为止的最小路径是什么
2.思路分析
题目解析:
主要使用搜索类算法,使用宽度优先遍历dfs: 对于所有可做的路径我都走一遍,并且通过一个vis数组记录一下从终点走到此位置用了多少步,直接返回第一次走到终点此时存的步数即可,因为没遇到墙淘汰的,每次都是同时移动一步的,第一次到达的绝对是最小的。
3.代码实现
package study2.day27;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
//走迷宫
public class Main {
//以i为开头的最短路径 不对这种思想应该使用bfs 宽度优先遍历 找出所有从终点上面走到终点的位置第一个到达就是
//每次各个方向都走一步,到达*结束,有一个到达后结束,第一个到达的肯定是最小路径
private static int n, m, x1, y1, x2, y2;
private static char[][] arrs;
private static int[][] vis;
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
arrs = new char[n + 1][m + 1];
vis = new int[n + 1][m + 1];
x1 = sc.nextInt();y1 = sc.nextInt();
x2 = sc.nextInt();y2 = sc.nextInt();
for (int i = 1; i <= n; i++) {
String temp = sc.next();
for (int j = 1; j <= m; j++) {
arrs[i][j] = temp.charAt(j - 1);
}
}
System.out.println(bfs());
}
private static int bfs() {
if (arrs[x2][y2] == '*') return -1;
//1.标记刚开始每个位置都没有搜索过
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
vis[i][j] = -1;
}
}
Queue<int[]> queue = new LinkedList<>();//队列
//2.起点加入队列
queue.add(new int[]{x1,y1});
vis[x1][y1] = 0;//初始化起点
while(!queue.isEmpty()){
int[] t = queue.poll();
int a = t[0],b = t[1];
for (int i = 0; i < 4; i++) {//上下左右四个方向搜索
int x = a + dx[i];
int y = b + dy[i];//坐标
if (x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y] == -1 && arrs[x][y] == '.'){
queue.add(new int[]{x,y});
vis[x][y] = vis[a][b] + 1;
if (x == x2 && y == y2) return vis[x][y];
}
}
}
return -1;
}
}