解题思路:
将起点,结果,三夫人的位置记录下来
bfs两次,第一次找到夫人的最短路劲,第二次是出口
注意事项:
TES都是可以走的。
参考代码:
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * @BelongsProject Demo * @BelongsPackage bfs * @Author lgb * @CreateTime 2022-06-13 11:28 * @Description TODO * @Version 1.0 * 先bfs找到 T ,在bfs找到出口 */ public class Main { //方向 上右下左 public static int[] fx = {0,1,0,-1}; public static int[] fy = {-1,0,1,0}; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //大小 int n = scanner.nextInt(); int m = scanner.nextInt(); scanner.nextLine(); String[][] mg = new String[n][m]; //起点,T,E的坐标 int[] x = new int[3]; int[] y = new int[3]; for (int i=0; i<n; i++) { String str = scanner.nextLine(); for (int j=0; j<m; j++) { mg[i][j] = str.charAt(j) + ""; if (mg[i][j].equals("S") ) { x[0] = j; y[0] = i; } else if (mg[i][j].equals("E") ) { x[1] = j; y[1] = i; } else if (mg[i][j].equals("T") ) { x[2] = j; y[2] = i; } } } //找到三夫人的最少步数 int a = bfs(mg, x[0], y[0], x[2], y[2]); //找到出口的最少步数 int b = bfs(mg, x[2], y[2], x[1], y[1]); System.out.println(a+ b); scanner.close(); } /** * bfs遍历 * @param mg 迷宫矩阵 * @param x 开始的横坐标 * @param y 开的的纵坐标 * @param k 结束的横坐标 * @param h 结束的纵坐标 * @return 步数 */ public static int bfs(String[][] mg, int x, int y, int k, int h) { //队列 Queue<int[]> queue = new LinkedList(); //标记 boolean[][] bool = new boolean[mg.length][mg[0].length]; //初始化 queue.add(new int[] {y, x} ); bool[y][x] = true; //步数 int n = 0; while (queue.size() != 0) { //队列中的参数个数 int flag = queue.size(); //走一步 n++; while (flag > 0) { //取一个 flag--; int[] a = queue.poll(); //上下左右4个方向进行对比如队列 for (int i=0; i<4; i++) { int j = fx[i] + a[1]; int p = fy[i] + a[0]; if (j >=0 && j < mg[0].length && p >= 0 && p<mg.length && !bool[p][j] && !mg[p][j].equals("1")) { //T,E也可以走 if (mg[p][j].equals("0") || mg[p][j].equals("T") || mg[p][j].equals("E")) { queue.add(new int[] {p, j} ); bool[p][j] = true; } //判断结束 if (j == k && p == h) { return n; } } } } } //没找到返回-1 return -1; } }
0.0分
0 人评分