0

0

c++如何实现广度优先搜索_c++算法bfs编写【实战】

穿越時空

穿越時空

发布时间:2026-03-16 21:17:03

|

890人浏览过

|

来源于php中文网

原创

应使用 std::queue 实现 BFS,因其底层基于 std::deque,支持 O(1) 入队出队且无需手动管理内存;需在入队前检查越界与访问合法性,用独立 vector 标记已访问,推荐用 emplace 和方向常量优化性能。

c++如何实现广度优先搜索_c++算法bfs编写【实战】

std::queue 实现 BFS,别手写队列

标准库的 std::queue 是最稳妥选择,它底层默认用 std::deque,支持 O(1) 的入队出队,且不用手动管理内存。自己用数组或链表模拟队列,容易在边界(比如空队列取 front())崩掉,还可能漏清空队列导致后续测试复现失败。

常见错误现象:std::queue::front()pop() 在空队列上调用 → 未定义行为,Debug 模式下可能断言失败,Release 下直接读垃圾内存。

  • 初始化时用 std::queue<:pair int>></:pair> 存坐标,比存指针或自定义结构体更轻量
  • 进队前必须检查越界和访问合法性(比如是否是障碍、是否已访问过),否则重复入队拖慢速度甚至死循环
  • 标记已访问的位置建议用独立的 std::vector<:vector>></:vector>,别依赖节点状态字段——BFS 中节点只进队一次,但状态字段若被多处修改,逻辑容易混乱

邻接点遍历顺序影响结果,但不影响连通性判断

BFS 本身不保证“字典序”或“顺时针”出队,只是按入队时间先后处理。如果你在网格中上下左右四个方向扩展,顺序写成 {-1,0}, {0,1}, {1,0}, {0,-1} 还是反过来,对是否能到达终点毫无影响,但会影响第一次到达某点的路径长度(这个长度始终是最短的)和具体走哪条最短路。

性能上无差异;兼容性也没问题——所有 C++ 标准都保证 std::queue 的 FIFO 行为。

立即学习C++免费学习笔记(深入)”;

会译·对照式翻译
会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

下载
  • 方向数组推荐封装成常量: const std::vector<:pair int>> dirs = {{-1,0},{0,1},{1,0},{0,-1}};</:pair>
  • 避免在循环里反复构造临时 std::pair,直接用 queue.emplace(r + dr, c + dc) 减少拷贝
  • 如果图是邻接表形式(std::vector<:vector>></:vector>),就遍历 graph[u],不用方向数组

遇到 std::queue 报错 “no matching function for call to …” 怎么办

这通常是因为你试图把不能默认构造或不可拷贝的类型塞进 std::queue。比如用了含引用成员、含 const 成员,或者自定义类没写移动构造函数,在 C++11 以后编译器会尝试移动语义,失败就报这个错。

典型场景:想存一个带父节点指针的结构体用于回溯路径,结果编译不过。

  • 优先改用值语义:比如存坐标 int r, c 而不是 Node*
  • 如果真要存复杂对象,确保它满足 MoveConstructible(有移动构造函数,或编译器自动生成)
  • 别用 std::queue<:unique_ptr>></:unique_ptr> —— std::unique_ptr 不可拷贝,但可以移动;这时必须用 emplacepush(std::move(ptr)),不能 push(ptr)

二维数组索引越界是 BFS 最常崩的点

尤其在网格题里,r + dr 算出来是 -1 或等于 height,直接当数组下标用,就是未定义行为。ASan(AddressSanitizer)能抓到,但线上环境不会提醒你。

别依赖“题目保证数据合法”——实际工程或 OJ 多组测试中,一组数据错了,后面全乱。

  • 检查必须写在进队前: if (nr >= 0 && nr = 0 && nc
  • 把行列检查逻辑抽成内联函数,比如 inline bool valid(int r, int c) { return r >= 0 && r = 0 && c ,减少重复和漏写
  • 如果用 std::vector 存网格,千万别混用 grid[r][c]grid.at(r).at(c) ——后者抛异常,前者不检查,崩溃了都不知道哪一行
BFS 看似简单,真正卡住人的永远是边界条件和状态同步:访问标记和入队动作必须严格配对,差一行位置,就可能让同一节点进队两次,或者漏更新距离。写完务必用单步调试看队列大小变化和 visited 数组翻转节奏。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

565

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

510

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

204

2025.07.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

510

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

204

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号