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

GESP6级C++考试语法知识(二十八、广度优先搜索(三、层级 BFS))

第三课《病毒扩散实验室——层级 BFS》一、故事开始危险的病毒1.砰一个危险的病毒储存罐炸了2、病毒开始扩散而且每分钟都会向四周蔓延3、算法国王问❓“最快要多久会感染扩散到王宫”4、算法大臣说“这可以使用 BFS 来看一下”二、今天要学什么1、前两课我们已经学会✅ BFS 会一层层扩散✅ BFS 可以求最短路✅ 二维迷宫 BFS2、今天我们要真正理解“层”的概念3、因为BFS 的核心就是“层”三、什么叫“层”1、假设病毒起点在中间。2、初始地图. . . . V . . . .3、这里V 病毒源头4、第0层病毒刚出现第0分钟5、第1层1分钟后上下左右感染. V . V V V . V .6、第2层继续扩散V V V V V V V V V7、你发现了吗病毒是一圈一圈扩散的这就是 BFS 的层四、BFS 为什么能求最短路1、因为1第0层0步到达2第1层1步到达3第2层2步到达4第3层3步到达所以2、BFS 的层数就是最短距离这是今天最重要的一个结论五、多个起点怎么办1、前两课只有一个起点。例如S2、但今天可能有多个病毒源头3、例如V . . . . . . . V4、病毒会同时扩散5、这叫多源 BFS六、多源 BFS 的核心思想其实非常简单1、把所有起点一起入队1例如q.push({0,0}); q.push({2,2});2于是两个病毒一起扩散。七、层级 BFS 是我们的帮手1、掌握这个特性是高手和新手的分界线2、有的同学只会背 BFS 模板。但不知道“层”到底怎么控制。3、今天我们要掌握层级 BFS的技巧八、队列分层技巧1、核心代码int sz q.size();2、什么意思表示当前这一层一共有多少个点3、例如队列里A B C4、说明这一层有3个位置。5、处理完这3个后所有下一批进入队列的就是下一层九、层级 BFS 的完整过程1、第0层队列V处理完后加入四周位置2、第1层再处理这些位置。于是一层一层扩散十、经典病毒感染题1、题目地图V . . . # . . . .规则2、每分钟病毒向上下左右扩散。3、墙壁#不能穿过。4、问几分钟感染整个地图十一、完整程序#include iostream #include queue using namespace std; struct Node { int x; int y; }; char mp[105][105]; bool vis[105][105]; int dx[4] {-1,1,0,0}; int dy[4] {0,0,-1,1}; int main() { int n 3; int m 3; char temp[3][3] { {V,.,.}, {.,#,.}, {.,.,.} }; // 复制地图 for(int i 0; i n; i) { for(int j 0; j m; j) { mp[i][j] temp[i][j]; } } queueNode q; // 找病毒起点 for(int i 0; i n; i) { for(int j 0; j m; j) { if(mp[i][j] V) { q.push({i,j}); vis[i][j] true; } } } int minute 0; while(!q.empty()) { int sz q.size(); // 当前层 for(int i 0; i sz; i) { Node cur q.front(); q.pop(); int x cur.x; int y cur.y; for(int d 0; d 4; d) { int nx x dx[d]; int ny y dy[d]; if(nx 0 nx n ny 0 ny m !vis[nx][ny] mp[nx][ny] ! #) { vis[nx][ny] true; q.push({nx, ny}); } } } // 扩散完一层 minute; } cout 感染完成用了 minute - 1 分钟 endl; return 0; }十二、程序执行过程1、第0分钟V . . . # . . . .2、第1分钟V V . V # . . . .3、第2分钟V V V V # . V . .4、继续……5、最终全部感染。十三、为什么 minute 要最后加初学同学这里会晕1、因为我们是一层处理完才过去1分钟2、不是处理一个点就1。十四、多源 BFS 的真正本质1、普通 BFS一个起点扩散2、多源 BFS多个起点同时扩散3、本质上还是 BFS十五、什么时候想到“层级 BFS”以后看到1、病毒传播2、火焰蔓延3、洪水扩散4、消息传播5、⏰最少时间扩散可以想到BFS十六、课堂挑战题 ⚔️挑战1地图V . . . . # . . . . . V问几分钟感染全地图挑战2如果病毒还能斜着传播怎么办提示方向数组改成八方向挑战3如果有的人2分钟后才会被感染怎么办提示加入队列还要看他的感染发作时间。十七、本课最终总结1、BFS 的本质一层一层扩散2、BFS 的层数就是最短距离3、⏰层级 BFS一层 一分钟4、多源 BFS多个起点一起扩散5、队列分层技巧int sz q.size();今天真正学会的不只是病毒题。而是掌握“时间扩散模型”。
http://www.gsyq.cn/news/1378895.html

相关文章:

  • 告别杂乱GitHub和文档:手把手教你用WRITE-BUG数字空间管理小组编程项目
  • 网络运维与网络安全 阶段一 基础篇二十
  • BME280传感器扩展板设计:兼容I2C/SPI接口与可配置电源方案详解
  • 互联网大厂Java面试:从Java SE到Spring Boot的全面探讨
  • 5分钟彻底解决网盘限速烦恼:开源工具LinkSwift完全使用指南
  • 【YOLO目标检测全栈实战】77 模型剪枝:让YOLO在边缘设备上“瘦身”的硬核实践
  • Apifox 测试项目实操
  • Apple Silicon Mac 电池管理的终极解决方案:Battery Toolkit 完整指南
  • QQ群数据采集终极教程:5分钟掌握批量抓取技巧
  • 抖音批量下载工具:高效获取用户主页全作品的专业解决方案
  • 从电路图到成品板:用AD和嘉立创搞定你的第一块CC2530开发板(附完整BOM清单)
  • DeepSeek开源协议识别:为什么92%的CI/CD流水线漏报AGPL传染风险?3行代码修复方案
  • 【每周分享】EtherCAT从站代码架构的简要解析
  • 抖音批量下载终极指南:如何3步免费获取用户主页全作品
  • 医用超声相控阵图像穿透力与分辨率问题:成因分析与解决思路
  • 如何3步完成Honey Select 2完整汉化:免费专业游戏翻译工具终极指南
  • OpenVSP飞机参数化设计:从零到一的完整建模与气动分析指南
  • 代码跑偏白盒补漏:判定节点覆盖全路径测试
  • 思源宋体完全免费商用指南:7种字重中文开源字体终极教程
  • 3步掌握TuxGuitar开源吉他谱编辑器:新手也能快速上手的完整指南
  • LDBlockShow完全指南:3步掌握基因组连锁不平衡分析可视化
  • 2026年Hermes Agent/OpenClaw如何集成?阿里云高可用安装及Token Plan配置
  • 终极UE4SS DLL错误排查指南:深度解析与系统级修复方案
  • STI-SNN硬件加速器:提升脉冲神经网络边缘计算能效
  • 别再只会用spline了!MATLAB csape函数详解:从自然边界到夹持边界的实战选择
  • 揭秘系统设计必杀技:算不对这笔云服务器账本也会被挂「蒸汽求职」
  • ARM SME非临时存储技术原理与优化实践
  • DeepSeek系统设计辅助:从Prompt建模到服务编排,7类典型失败场景全复盘
  • 为什么你的DeepSeek总生成无效边界值?揭秘LLM测试生成中的3层语义断层与2种对齐方案
  • 【AI代码审查新纪元】:DeepSeek为何比GitHub Copilot Code Review准确率高42%?