美文网首页
BFS——练习题——蒜头君回家

BFS——练习题——蒜头君回家

作者: markeNick | 来源:发表于2020-02-19 00:15 被阅读0次
题目.png

输入样例:

8 10
P.####.#P#
..#..#...#
..#T##.#.#
..........
..##.#####
..........
#####...##
###....S##

输出样例:

21

思路


最初的思路就是:找到第一把钥匙后立马找出口
利用三维数组,模拟两个平行面,在第一个平行面找到钥匙后,进入第二个平行面找出口。

利用BFS第一次找到的是最短这个特点,可以得知第一次找到钥匙是最短,第一次到出口也是最短,所以总路径最短。

代码


import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    
    static class Node {
        int x;
        int y;
        int step;       // 记录到这个点的步数
        int key = 0;    // 标记是否找到钥匙

        public Node(int x, int y, int step, int key) {
            super();
            this.x = x;
            this.y = y;
            this.step = step;
            this.key = key;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int m = sc.nextInt();
        int sx = 0;
        int sy = 0;

        char[][] map = new char[n][m];
        
        /**
         * 三维数组,第三维看作平行面,这里两个平行面
         *      在第一个平行面找钥匙,找到第一把钥匙就跳到第二平行面
         *      在第二个平行面找出口
         *      BFS是一层一层搜索的,所以找到第一把钥匙的步数要比第二把的短,
         *      拿到钥匙后,立马找出口,找的出口也是离这个钥匙是最短的
         */
        int[][][] vis = new int[n + 5][m + 5][2];
        
        int[][] dir = {
                {-1, 0},
                {0, 1},
                {1, 0},
                {0, -1}
        };
        
        for (int i = 0; i < n; i++) {
            String str = sc.next();
            for (int j = 0; j < m; j++) {
                char c = str.charAt(j);
                if(c == 'S') {
                    sx = i;
                    sy = j;
                }
                map[i][j] = str.charAt(j);
            }
        }
        
        Node start = new Node(sx, sy, 0, 0);
        
        Queue<Node> queue = new LinkedList<Node>();
        queue.add(start);
        Node now = start;
        vis[sx][sy][0] = 1;
        
        while(!queue.isEmpty()) {
            now = queue.poll();
            int x = now.x;
            int y = now.y;
            int step = now.step;
            int key = now.key;
            
            // 找到第一把钥匙就进入第二平行面
            if(map[x][y] == 'P') {
                key = 1;
                vis[x][y][1] = 1;
            }
            
            // 拥有钥匙并找到出口就输出结果
            if(map[x][y] == 'T' && key == 1) {
                System.out.println(now.step);
                return;
            }
            
            for (int i = 0; i < 4; i++) {
                int tx = x + dir[i][0];
                int ty = y + dir[i][1];
                
                if(tx < 0 || tx >= n || ty < 0 || ty >= m) continue;
                
                if(map[tx][ty] != '#' && vis[tx][ty][key] == 0) {
                    vis[tx][ty][key] = 1;
                    Node next = new Node(tx, ty, step + 1, key);
                    queue.add(next);
                }
            }
        }
    }
}

相关文章

  • BFS——练习题——蒜头君回家

    输入样例: 输出样例: 思路 最初的思路就是:找到第一把钥匙后立马找出口利用三维数组,模拟两个平行面,在第一个平行...

  • leetcode79 单词搜索

    题目 单词搜索 分析 解法:dfs没啥可讲的,dfs初级练习题目(当然bfs也没问题)。 代码

  • 第20章 动态规划入门

    1、蒜头君爬楼梯(一) 算法分析 时间复杂度 Java 代码 2、蒜头君爬楼梯(二) 算法分析 时间复杂度 Jav...

  • 计蒜客_新报数游戏

    Time 2000ms RAM 32767K 题面: 蒜头君在和他的朋友们一起玩一个游戏。由于蒜头君的机智,这个 ...

  • 计蒜客 - 首尾相接

    计蒜客 - 首尾相接 蒜头君有两个字符串 和 ,蒜头君想把 接到 后面。因为 前面有一些字符和 后面的一...

  • BFS——练习题——密码锁

    基本模型 练习题 1.密码锁 现在一个紧急的任务是打开一个密码锁。 密码由四位数字组成,每个数字从1到9进行编码。...

  • BFS——练习题——乳草的侵占

    乳草的侵占 Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类...

  • 蒜头

    小时候,我们姐弟三个最喜欢在妈妈炒的菜里挑蒜头吃,拍扁去皮切碎了的蒜头等到青菜将熟未熟的时候放入,炒熟透以后搭配着...

  • 蒜头

    办公室里一点绿色也没有。疫情期间也没有别的去处,于是就从食堂带了一颗蒜回到办公室,泡上点水,等着发芽。 左等右等也...

  • 走迷宫(BFS例题)

    BFS例题---走迷宫 BFS对应数据结构queue BFS算法时间复杂度O(n^2) BFS算法不走走过的点 的...

网友评论

      本文标题:BFS——练习题——蒜头君回家

      本文链接:https://www.haomeiwen.com/subject/zglofhtx.html