瀚宇


私信TA

用户名:uq_64486686466

访问量:328

签 名:

等  级
排  名 33231
经  验 416
参赛次数 0
文章发表 5
年  龄 0
在职情况 学生
学  校 泸州职业技术学院
专  业 19级应用电子技术

  自我简介:

来自泸州职业技术学院的一名大专生。

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

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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区