Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【BFS最短路】迷宫中离入口最近的出口 / 最小基因变化 / 单词接龙 / 为高尔夫比赛砍树

【BFS最短路】迷宫中离入口最近的出口 / 最小基因变化 / 单词接龙 / 为高尔夫比赛砍树

作者头像
_小羊_
发布于 2025-04-09 00:43:33
发布于 2025-04-09 00:43:33
6300
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

迷宫中离入口最近的出口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
        int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
        bool used[101][101] = {};
        int m = maze.size(), n = maze[0].size(), step = 0;
        queue<pair<int, int>> q;
        int row = entrance[0], col = entrance[1];
        q.push({row, col});
        used[row][col] = true;
        while (q.size())
        {
            step++; // 向外扩展一层
            int sz = q.size();
            while (sz--) 
            {
                auto [a, b] = q.front();
                q.pop();
                for (int i = 0; i < 4; i++)
                {
                    int x = a + dx[i], y = b + dy[i];
                    if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' 
                        && !used[x][y])
                    {
                        if (x == 0 || x == m - 1 || y == 0 || y == n - 1) return step;
                        used[x][y] = true;
                        q.push({x, y});
                    }
                }
            }
        }
        return -1;
    }
};

最小基因变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int minMutation(string startGene, string endGene, vector<string>& bank) {
        unordered_set<string> hash(bank.begin(), bank.end());
        unordered_set<string> used;
        const string str = "ACGT";

        if (startGene == endGene) return 0;
        if (!hash.count(endGene)) return -1;

        queue<string> q;
        q.push(startGene);
        used.insert(startGene);
        int step = 0;
        while (q.size())
        {
            step++;
            int sz = q.size();
            while (sz--)
            {
                string s = q.front();
                q.pop();
                for (int i = 0; i < 8; i++)
                {
                    string tmp = s;
                    for (int j = 0; j < 4; j++)
                    {
                        tmp[i] = str[j];
                        if (tmp == endGene) return step;
                        if (hash.count(tmp) && !used.count(tmp))
                        {
                            used.insert(tmp);
                            q.push(tmp);
                        }
                    }
                }
            }
        }
        return -1;
    }
};

单词接龙

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> hash(wordList.begin(), wordList.end());
        unordered_set<string> used;
        queue<string> q;
        if (!hash.count(endWord)) return 0;
        q.push(beginWord);
        used.insert(beginWord);
        int ret = 1; // 最初beginWord也算一个单词
        while (q.size())
        {
            ret++;
            int sz = q.size();
            while (sz--)
            {
                string str = q.front();
                q.pop();
                for (int i = 0; i < beginWord.size(); i++)
                {
                    string tmp(str);
                    for (char ch = 'a'; ch <= 'z'; ch++)
                    {
                        tmp[i] = ch;
                        if (tmp == endWord) return ret;
                        if (hash.count(tmp) && !used.count(tmp))
                        {
                            used.insert(tmp);
                            q.push(tmp);
                        }
                    }
                }
            }
        }
        return 0;
    }
};

为高尔夫比赛砍树

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
    int m, n, ret = 0;
public:
    int cutOffTree(vector<vector<int>>& forest) {
        m = forest.size(), n = forest[0].size();
        map<int, pair<int, int>> hash;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (forest[i][j] > 1)
                    hash[forest[i][j]] = {i, j};
        int bx = 0, by = 0;
        for (auto &[a, b] : hash)
        {
            int step = bfs(forest, bx, by, b.first, b.second);
            if (step == -1) return -1;
            ret += step;
            bx = b.first;
            by = b.second;
        }
        return ret;
    }
    int bfs(vector<vector<int>>& forest, int bx, int by, int ex, int ey)
    {
        if (bx == ex && by == ey) return 0;
        int ret = 0;
        queue<pair<int, int>> q;
        bool used[51][51] = {};
        q.push({bx, by});
        used[bx][by] = true;
        while (q.size())
        {
            ret++;
            int sz = q.size();
            while (sz--)
            {
                auto [a, b] = q.front();
                q.pop();
                for (int i = 0; i < 4; i++)
                {
                    int x = a + dx[i], y = b + dy[i];
                    if (x == ex && y == ey) return ret;
                    if (x >= 0 && x < m && y >= 0 && y < n && forest[x][y] && !used[x][y])
                    {
                        used[x][y] = true;
                        q.push({x, y});
                    }
                }
            }
        }
        return -1;
    }
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
    int m, n, ret = 0;
public:
    int cutOffTree(vector<vector<int>>& f) {
        m = f.size(), n = f[0].size();
        vector<pair<int, int>> trees;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (f[i][j] > 1) 
                    trees.push_back({i, j});
        sort(trees.begin(), trees.end(), 
            [&f](const pair<int, int>& p1, const pair<int, int>& p2)
            { return f[p1.first][p1.second] < f[p2.first][p2.second];});
        
        int bx = 0, by = 0;
        for (auto [a, b] : trees)
        {
            int step = bfs(f, bx, by, a, b);
            if (step == -1) return -1;
            ret += step;
            bx = a, by = b;
        }
        return ret;
    }
    int bfs(vector<vector<int>>& f, int bx, int by, int ex, int ey)
    {
        // 处理边界情况
        if (bx == ex && by == ey) return 0;
        queue<pair<int, int>> q;
        bool used[51][51] = {};
        q.push({bx, by});
        used[bx][by] = true;
        int ret = 0;
        while (q.size())
        {
            ret++;
            int sz = q.size();
            while (sz--)
            {
                auto [a, b] = q.front();
                q.pop();
                for (int i = 0; i < 4; i++)
                {
                    int x = a + dx[i], y = b + dy[i];
                    if (x == ex && y == ey) return ret;
                    if (x < 0 || x >= m || y < 0 || y >= n || !f[x][y] || used[x][y])
                        continue;
                    used[x][y] = true;
                    q.push({x, y});
                }
            }
        }
        return -1;
    }
};

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【BFS最短路问题】为高尔夫比赛砍树
​ 你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中:
利刃大大
2025/03/06
460
【BFS最短路问题】为高尔夫比赛砍树
【算法刷题指南】BFS-解决最短路问题
南桥
2024/11/23
880
BFS:解决最短路问题
最短路问题是图论中的经典问题,旨在寻找图中两个节点之间的最短路径。常见的最短路算法有多种,这次我们讲的主要是以边权为1的最短路问题,什么是边呢?在图论中,权是两个节点的连线的路程。 举个简单的例子:
用户11305458
2024/10/09
1730
BFS:解决最短路问题
【C++】BFS解决边权唯一的最短路径问题
很明显,实际情况的道路更加复杂,两个地点之间的距离不能全是1,所以边权为1的最短路问题是比较特殊,简单的最短路问题
啊QQQQQ
2024/11/19
1560
【C++】BFS解决边权唯一的最短路径问题
BFS:边权相同的最短路问题
转化成多个最短路问题,但是我们需要知道从哪树开始砍,第一个方法就是用map进行存储,可以顺便帮助我们排序,第二个方法就是用vector进行存储,然后sort+lambda表达式解决问题
小陈在拼命
2024/07/16
1000
BFS:边权相同的最短路问题
【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)
_小羊_
2025/05/01
580
【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)
【今日三题】ISBN号码(模拟) / kotori和迷宫(BFS最短路) / 矩阵最长递增路径(dfs)
_小羊_
2025/05/09
320
【今日三题】ISBN号码(模拟) / kotori和迷宫(BFS最短路) / 矩阵最长递增路径(dfs)
【算法】图论
_小羊_
2025/03/14
580
【算法】图论
【算法刷题指南】多源BFS问题
南桥
2024/12/22
910
【算法刷题指南】队列+宽搜(BFS)
南桥
2024/11/27
610
算法手记5
修修修也
2025/03/17
390
算法手记5
【C++】多源BFS问题和拓扑排序
顾名思义,单源BFS是只有一个起点,博客CSDN中已经阐述过,如有不明白者,可前去一探究竟,而多源BFS是有多个起点,然后同时出发,到达终点;
啊QQQQQ
2024/11/19
890
【C++】多源BFS问题和拓扑排序
【算法】bfs解决FloodFill问题
FloodFill就是洪水灌溉,解决的就是下面这样一种模型。 解决性质相同的联通块问题,用的方法就是dfs深度优先搜索遍历:一条道走到黑,直到不能再走,不能再走就倒回去;或者是bfs宽度优先搜索遍历:一层一层剥开
zxctscl
2024/04/15
1220
【算法】bfs解决FloodFill问题
48days强训——day7
思路:遍历字符串,当遇到数字时,用双指针计算子字符串的长度。若该长度大于之前记录的最大长度,更新起始位置和最大长度。最后输出最长连续数字串。
秋邱
2025/03/30
390
48days强训——day7
【leetcode】逐层探索:BFS求解最短路的原理与实践
在解决下面几道题之前,小编要展开讲讲为啥我们的BFS宽度优先遍历可以解决这里的最短路问题,我们在之前已经了解到,这个的宽度优先遍历BFS的遍历方法如同病毒扩散的方式进行扩散遍历,那么好就是一个关键
用户11288949
2025/05/18
1230
【leetcode】逐层探索:BFS求解最短路的原理与实践
BFS:队列+树的宽搜
该题的层序遍历和以往不同的是需要一层一层去遍历,每一次while循环都要知道在队列中节点的个数,然后用一个for循环将该层节点走完了再走下一层
小陈在拼命
2024/06/28
680
BFS:队列+树的宽搜
【C++】 —— 笔试刷题day_5
为什么可以分为两种呢? 第一种就是模拟实现整个过程,可以说是暴力解法了 第二种它们都有一个共同的思路,就是将问题一步一步划分,然后寻找子问题的关系;从而简化整个过程。
星辰与你
2025/03/16
470
【C++】 —— 笔试刷题day_5
【C++】BFS解决Floodfill问题
图中的数字代表的是陆地的高度,水往地处流,这里我们用负数代表低洼的区域,所以这个图中可以分为陆地和水域两种区域,水域是被陆地包裹着的;
啊QQQQQ
2024/11/19
1120
【C++】BFS解决Floodfill问题
【C++笔试强训】如何成为算法糕手Day5
这是一道简单的模拟题,我们要找出三个字符(y、o、u)中最少的那个字符的数量,这个数量n表示最多能组成多少个"you"。然后,我们计算o字符的总数减去n,得到剩余的o字符数量。如果剩余的o字符少于2个,那么就不需要进一步操作。如果剩余的o字符数量是2个或更多,我们可以在结果上加1(对于2个o),加2(对于3个o),以此类推。最终的结果是n加上剩余o字符数量减去1。
小文要打代码
2024/10/16
1020
【C++笔试强训】如何成为算法糕手Day5
FZU2285 迷宫问题 BFS求最短路-板子题
Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上、下、左、右)。现洪尼玛在迷宫的入口处,问他最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。
杨鹏伟
2020/09/11
6220
相关推荐
【BFS最短路问题】为高尔夫比赛砍树
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验