解题思路:
将起点,结果,三夫人的位置记录下来

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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论