当前位置: 首页 > article >正文

从LeetCode到ACM:迷宫最短路径的C++ BFS模板,这么写就对了

从LeetCode到ACM迷宫最短路径的C BFS模板实战精解在算法竞赛和面试刷题中迷宫类问题是最经典的场景之一。无论是LeetCode上的简单矩阵遍历还是ACM竞赛中复杂的路径搜索广度优先搜索BFS都是解决这类问题的利器。本文将为你呈现一份经过实战检验的C BFS模板它不仅适用于迷宫最短路径问题还能灵活适配各种变体题目。1. BFS核心思想与迷宫问题适配BFS之所以成为解决迷宫最短路径问题的首选算法源于其层层推进的搜索特性。想象你站在迷宫的起点每次探索所有可能的下一步位置这种策略自然保证了首次到达终点时的路径就是最短的。在实现上BFS通常需要以下几个核心组件队列Queue存储待访问的节点先进先出的特性保证了层级遍历的顺序访问标记Visited避免重复访问和形成环路方向数组定义可能的移动方向上下左右或更多对于典型的迷宫问题我们需要特别注意几个实现细节// 经典的方向数组定义 int dx[4] {-1, 0, 1, 0}; // 上、右、下、左 int dy[4] {0, 1, 0, -1};提示方向数组的定义顺序不影响算法正确性但保持一致的定义习惯可以减少编码错误2. 鲁棒性BFS模板代码解析下面是一个经过精心设计的BFS模板它考虑了各种边界情况和常见陷阱#include iostream #include queue #include cstring // 用于memset using namespace std; const int N 110; int grid[N][N]; // 迷宫矩阵 int dist[N][N]; // 记录到每个点的最短距离 int n, m; // 迷宫的行列数 int bfs() { queuepairint, int q; memset(dist, -1, sizeof dist); // 初始化为-1表示未访问 q.push({0, 0}); // 起点(0,0) dist[0][0] 0; // 起点距离为0 int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; while (!q.empty()) { auto t q.front(); q.pop(); for (int i 0; i 4; i) { int x t.first dx[i], y t.second dy[i]; // 边界检查 可通行检查 未访问检查 if (x 0 x n y 0 y m grid[x][y] 0 dist[x][y] -1) { dist[x][y] dist[t.first][t.second] 1; q.push({x, y}); // 提前终止检查 if (x n - 1 y m - 1) { return dist[x][y]; } } } } return dist[n-1][m-1]; // 保证有解的情况下不会执行到这里 } int main() { cin n m; for (int i 0; i n; i) for (int j 0; j m; j) cin grid[i][j]; cout bfs() endl; return 0; }这个模板相比原始代码有几处关键改进独立的距离数组使用dist数组专门记录距离避免混淆更安全的初始化用memset初始化距离数组为-1同时表示未访问状态更清晰的边界处理统一使用0-based索引避免1-based和0-based混用提前终止优化找到终点立即返回减少不必要的计算3. 不同OJ平台的适配技巧不同在线判题系统在题目设置和输入输出上有细微差别了解这些差异可以避免不必要的WAWrong Answer。3.1 LeetCode风格适配LeetCode通常以函数形式出题需要关注输入通常是全局变量或函数参数输出通过return返回矩阵尺寸可能不固定// LeetCode风格的BFS实现示例 class Solution { public: int shortestPathBinaryMatrix(vectorvectorint grid) { if (grid[0][0] 1) return -1; int n grid.size(); vectorvectorint dist(n, vectorint(n, -1)); queuepairint, int q; q.push({0, 0}); dist[0][0] 1; int dx[8] {-1, -1, -1, 0, 1, 1, 1, 0}; int dy[8] {-1, 0, 1, 1, 1, 0, -1, -1}; while (!q.empty()) { auto [x, y] q.front(); q.pop(); if (x n-1 y n-1) { return dist[x][y]; } for (int i 0; i 8; i) { int nx x dx[i], ny y dy[i]; if (nx 0 nx n ny 0 ny n grid[nx][ny] 0 dist[nx][ny] -1) { dist[nx][ny] dist[x][y] 1; q.push({nx, ny}); } } } return -1; } };3.2 ACM/ICPC风格注意事项ACM竞赛题目通常需要处理多组测试数据文件结束判断更严格的时限和内存限制// ACM风格的多组测试数据处理 int main() { while (cin n m) { // 处理到文件结束 for (int i 0; i n; i) for (int j 0; j m; j) cin grid[i][j]; cout bfs() endl; } return 0; }4. 常见陷阱与优化技巧即使理解了BFS的基本原理实际编码中仍会遇到各种陷阱。以下是几个高频问题及解决方案4.1 步数多算一次问题初学者常犯的错误是在每次从队列取出元素时才增加步数这会导致结果多算一次。正确的做法应该是在扩展下一层节点前记录当前层的节点数。错误示例while (!q.empty()) { res; // 错误每次循环都增加步数 auto t q.front(); q.pop(); // ... }正确做法while (!q.empty()) { int levelSize q.size(); // 记录当前层的节点数 for (int i 0; i levelSize; i) { auto t q.front(); q.pop(); // 处理当前节点 } res; // 处理完一层才增加步数 }4.2 方向数组的高级用法除了基本的四方向移动BFS可以扩展到更多复杂场景八方向移动适用于更自由的移动规则代价敏感移动不同方向可能有不同代价三维空间增加z轴方向// 八方向移动示例 int dx[8] {-1, -1, -1, 0, 1, 1, 1, 0}; int dy[8] {-1, 0, 1, 1, 1, 0, -1, -1}; // 带权移动示例需要优先队列 struct State { int x, y, cost; bool operator(const State other) const { return cost other.cost; } }; priority_queueState, vectorState, greaterState pq;4.3 状态压缩与剪枝对于复杂迷宫问题可能需要记录额外状态携带钥匙使用位掩码记录获得的钥匙剩余步数记录到达当前位置时的剩余能力方向限制记录来自哪个方向// 带钥匙的状态示例 struct State { int x, y; int keys; // 使用位掩码每位代表一把钥匙 }; // 相应的访问数组 int dist[N][N][1 K]; // K是需要携带的钥匙数量5. 模板的扩展应用掌握了基础迷宫问题的BFS解法后我们可以将其应用到更广泛的场景中5.1 Flood Fill算法Flood Fill是BFS的典型应用用于连通区域填充void floodFill(vectorvectorint image, int sr, int sc, int newColor) { int oldColor image[sr][sc]; if (oldColor newColor) return; int m image.size(), n image[0].size(); queuepairint, int q; q.push({sr, sc}); image[sr][sc] newColor; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; while (!q.empty()) { auto [x, y] q.front(); q.pop(); for (int i 0; i 4; i) { int nx x dx[i], ny y dy[i]; if (nx 0 nx m ny 0 ny n image[nx][ny] oldColor) { image[nx][ny] newColor; q.push({nx, ny}); } } } }5.2 多源BFS当问题中存在多个起点时可以初始化队列时加入所有起点// 多源BFS初始化示例 queuepairint, int q; for (auto source : sources) { q.push(source); dist[source.first][source.second] 0; }5.3 双向BFS对于起点和终点都明确的问题双向BFS可以显著提高效率// 双向BFS框架示例 queueNode q1, q2; unordered_setNode visited1, visited2; q1.push(start); q2.push(end); visited1.insert(start); visited2.insert(end); while (!q1.empty() !q2.empty()) { // 交替扩展两个方向的搜索 if (expand(q1, visited1, visited2)) return true; if (expand(q2, visited2, visited1)) return true; }

相关文章:

从LeetCode到ACM:迷宫最短路径的C++ BFS模板,这么写就对了

从LeetCode到ACM:迷宫最短路径的C BFS模板实战精解 在算法竞赛和面试刷题中,迷宫类问题是最经典的场景之一。无论是LeetCode上的简单矩阵遍历,还是ACM竞赛中复杂的路径搜索,广度优先搜索(BFS)都是解决这类问…...

平衡小车/倒立摆核心:用STM32CubeMX和串级PID实现精准角度控制,调参避坑指南

平衡小车与倒立摆实战:STM32CubeMX串级PID调参全解析 平衡控制系统一直是嵌入式开发者的试金石。去年校电赛上,我亲眼见证一支队伍因为PID参数整定不当,导致他们精心设计的倒立摆在演示时像喝醉了一样左右摇摆,最终与奖项失之交臂…...

HunyuanVideo-FoleyGPU算力优化实践:24GB显存利用率提升30%实测分析

HunyuanVideo-FoleyGPU算力优化实践:24GB显存利用率提升30%实测分析 1. 引言 在视频内容创作领域,HunyuanVideo-Foley作为一款集视频生成与AI音效合成于一体的先进工具,正逐渐成为专业创作者的首选。然而,其强大的功能背后是对硬…...

文科生被AI大厂疯抢,月薪3万起,这条热搜,你真的看懂了吗?

最近有个话题悄悄冲上热搜,看得不少人心里一热——#AI大厂月薪3万疯抢文科生#。 事情起因是360创始人周鸿祎在一次采访里说了个挺颠覆的观点:“随着AI技术的发展,文科生将比理科生更吃香。”截图来源微博(如侵删) 他给…...

易语言飞将ddddocr识图识字PaddleOCR识图识字苍狼OCR简单识字简化

易语言飞将ddddocr识图识字PaddleOCR识图识字苍狼OCR简单识字简化 超级简单的识图识字模块,简单初始化后即可使用,不用做其它多余的步骤 超级简单,下载即用,特别适合小白使用 下载地址:https://daidijia.lanzoue.com/i…...

用74ls10和74ls20与非门搭建四人表决器:从真值表到电路图的完整设计流程

用74LS10和74LS20与非门搭建四人表决器:从真值表到电路图的完整设计流程 在数字电路设计中,表决器是一个经典的教学案例,它不仅能帮助理解组合逻辑电路的基本原理,还能锻炼从理论到实践的完整设计能力。本文将手把手带你用74LS10…...

基于策略模式与智能编排的抖音批量下载系统架构设计与实现

基于策略模式与智能编排的抖音批量下载系统架构设计与实现 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在当今内容驱动的互联网时代,抖音平台汇聚了海量的短视频内容。对于内容创作者、研究者…...

NVIDIA显卡在WSL2下的CUDA开发环境搭建:为什么我的nvcc命令找不到?

NVIDIA显卡在WSL2下的CUDA开发环境搭建:为什么我的nvcc命令找不到? 当你在WSL2中兴奋地准备开始CUDA开发时,却遭遇了"nvcc: command not found"的报错,这种挫败感我深有体会。作为在WSL2环境下进行CUDA开发的老手&…...

深度拆解 JDK1.8 ConcurrentHashMap 核心方法:从 put 到扩容,彻底吃透并发神器

在 Java 高并发编程中,ConcurrentHashMap是线程安全 Map 的绝对首选,而 JDK1.8 版本对它的重构堪称并发设计的巅峰之作 —— 彻底抛弃分段锁,用CAS 桶级 synchronized实现极致细粒度并发,搭配多线程协同扩容、链表红黑树转换、高…...

毕业季、返修季、投稿季:SCI论文润色,到底能不能提高接收率?

“SCI论文如果先润色,再投稿,是不是更容易被接收?”这个问题,真的每年到了这个时间点都会高频出现。尤其是3月底到4月初,很多同学刚从基金申请、毕业论文、返修修改的高压节奏里缓过来,马上又进入下一轮“赶…...

KITTI数据集实战指南:从下载到3D目标检测全流程解析(附避坑技巧)

KITTI数据集实战指南:从下载到3D目标检测全流程解析(附避坑技巧) 1. 为什么选择KITTI数据集? 在计算机视觉和自动驾驶研究领域,数据是算法进步的基石。KITTI数据集自2012年发布以来,已成为全球最具影响力的…...

UML(Unified Modeling Language,统一建模语言)是一种标准化的可视化建模语言,广泛用于软件系统的需求分析

UML(Unified Modeling Language,统一建模语言)是一种标准化的可视化建模语言,广泛用于软件系统的需求分析、设计与文档化。你列出的是UML 2.x 中最常用的六种结构与行为图,分别属于两大类: ✅ 结构图&#…...

react二次封装

先在src下创建一个utils文件一次封装下载npm install axios在utils文件创建个request.jsimport axios from axios;// 创建axios实例 const instance axios.create({timeout: 10000,headers: {Content-Type: application/json},baseURL: https://zzgoodqc.cn/ });// 请求拦截器…...

3个关键技巧彻底解决Photoshop WebP格式兼容性问题

3个关键技巧彻底解决Photoshop WebP格式兼容性问题 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 在当今Web开发与设计领域,WebP格式已成为图像优化的黄金标准&am…...

用2万小时人类视频预训练机器人,一场豪赌还是必经之路?

先说结论核心验证了“人类数据缩放定律”:在灵巧操作任务上,模型性能随人类预训练数据量对数线性增长,为数据策略提供了可预测的依据。成功的关键在于“两阶段迁移”设计:用大规模、廉价但“嘈杂”的人类数据奠基通用结构&#xf…...

通义千问多模态检索系统:图文视频混合输入全解析

通义千问多模态检索系统:图文视频混合输入全解析 1. 多模态检索的行业痛点与解决方案 在信息爆炸的时代,传统文本检索系统面临三大核心挑战: 跨模态匹配失效:用户用文字描述"红色跑车在沙漠驰骋",系统却返…...

GPEN图像修复新手入门:界面介绍与功能详解

GPEN图像修复新手入门:界面介绍与功能详解 1. 认识GPEN图像修复工具 你是否遇到过这样的情况:翻出老照片想分享给亲友,却发现照片已经泛黄、模糊甚至出现划痕?GPEN图像修复工具就是为解决这些问题而生的专业解决方案。这个由科哥…...

英雄联盟游戏助手:5大功能全面解析,打造你的专属游戏体验

英雄联盟游戏助手:5大功能全面解析,打造你的专属游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...

利用快马平台快速生成javascript交互原型:以动态待办列表为例

利用快马平台快速生成JavaScript交互原型:以动态待办列表为例 最近在尝试快速验证一个待办事项应用的交互设计,发现用传统方式从零开始写代码太耗时了。正好试用了InsCode(快马)平台,只需要描述功能需求,就能自动生成可运行的Jav…...

LH6828@ACP#6828#484 USB3.1 全通道 4:1/1:4 10Gbps 多路复用 / 解复用器 产品规格、应用分享及CH484规格对比

LH6828 是一款高性能全通道高速双向无源开关,专为 USB Type-C 生态系统设计,深度适配 USB3.1 Gen1(5Gbps)/Gen2(10Gbps)超高速传输协议,支持 4 组设备全通道信号的 4:1/1:4 双向切换&#xff0c…...

注CO2驱替煤层气THM耦合模型与自定义PDE耦合固体力学

注co2驱替煤层气THM耦合模型 自定义pde耦合固体力学今天,我来分享一下关于CO2驱替煤层气的THM(热-水-力学)耦合模型的构建过程。这个模型听起来有点复杂,但其实拆开来理解,每一步都还挺有意思的。尤其是其中涉及的自定…...

大模型Transformer架构学习

基础知识: 损失函数:梯度下降单次训练过程过拟合数据增强:增加训练数据,对原始数据加噪,翻转,旋转 正则化:防止该函数过分变化,让损失函数加上该参数,调整损失函数时会抑…...

告别传统BPMN:wflow工作流设计器如何让普通员工5分钟搭建审批流程?

告别传统BPMN:wflow工作流设计器如何让普通员工5分钟搭建审批流程? 【免费下载链接】wflow workflow 工作流设计器,企业OA流程设计。表单流程设计界面操作超级简单!!普通用户也能分分钟上手,不需要专业知识…...

OpenClaw人人养虾:网关架构

本文档描述 Gateway(网关)的内部架构设计,帮助你理解各组件之间的协作关系。 架构总览 ┌──────────────────────────────────────────────────────────┐ │ …...

给视觉新手的保姆级教程:用Python+OpenCV玩转四步相移结构光(附代码)

零基础实战:用PythonOpenCV实现四步相移结构光三维重建 在计算机视觉领域,结构光三维重建技术因其高精度和非接触特性,被广泛应用于工业检测、逆向工程和医疗成像。对于刚接触这一领域的新手来说,最困扰的往往不是理解原理&#x…...

把 SAP ABAP CDS View Code Mapping 讲透:从 SEGW 映射到 SADL 运行时的关键机制与项目实践

很多 ABAP 开发者在第一次接触 CDS View Code Mapping 时,容易把它理解成一次普通的字段映射操作:左边是 CDS 字段,右边是 OData 属性,拖一拖、连一连,事情就结束了。真正进入项目以后,大家才会发现,这个动作背后牵动的是 SAP Gateway、SADL、DPC 运行时、关联导航,以及…...

[小红书AI自动化教程]凌晨2点我在睡觉,AI偷偷发了篇小红书爆款:醒来99+点赞,人类社媒苦役终结?

我把小红书交给 OpenClaw,它开始自己干活了 凌晨两点,我在睡觉,它却偷偷发了一篇爆款。 醒来点赞99,评论全是“姐妹求链接”。这不是科幻。去年我还为追热点熬夜秃头,如今一句“今天发什么”,AI 就能完成选…...

用NoneBot2给Lagrange机器人加buff:5个提升效率的插件开发技巧

用NoneBot2给Lagrange机器人加buff:5个提升效率的插件开发技巧 在智能对话机器人领域,NoneBot2与Lagrange的组合已经成为QQ生态中高效开发的黄金搭档。但当你已经掌握了基础功能开发后,如何让机器人更智能、更稳定、更能应对复杂场景&#xf…...

英雄联盟智能助手完全指南:3分钟掌握LCU API自动化工具

英雄联盟智能助手完全指南:3分钟掌握LCU API自动化工具 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟…...

基于springboot框架个性化旅游线路推荐系统 景区门票 酒店 预订88u7sgf 有论文-idea maven vue

目录系统架构设计技术选型与工具数据库设计核心功能实现论文研究要点开发计划安排项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用前后端分离架构,后端基于SpringBoot框架,前端使用Vue…...