【多源 BFS】地图分析
文章目录题目解析方向向量算法原理细节问题层序遍历代码实现题目链接1162. 地图分析题目解析多源点最短路问题指的是多个单源点最短路问题。对于单源点最短路问题是只有一个起点和一个终点的而对于多源点最短路问题是有多个起点和一个终点。而多源 BFS则指的是用 BFS 解决边权为 1 的多源点最短路问题。对于这类问题通常是将所有起点看作一个“超级源点”然后问题就变成只有一个起点(超级源点) 和一个终点的单源点最短路问题了。然后使用一次 BFS 即可解决问题。具体的步骤先将所有的起点加入队列中等同于将超级源点加入队列逐层往外扩展题目给出一个大小n x n的网格grid上面的每个单元格都用0和1标记0代表海洋1代表陆地。我们需要找出一个海洋单元格该单元格离它最近陆地单元格的距离最大然后返回这个最大的距离。如果网格上只有陆地或者海洋就返回-1。这里的距离指的是曼哈顿距离举例点x1y1和点x2y2的距离为|x1 - x2| |y1 - y2|例1grid [[1,0,1],[0,0,0],[1,0,1]]101000101dist 矩阵010121010输出2例2grid [[1,0,0],[0,0,0],[0,0,0]]100000000dist 矩阵012123234输出4方向向量在继续之前有必要知道我们在解决矩阵搜索类问题时访问某位置上下左右四个方向的操作。坐标〖i, j〗的上下左右四个坐标是在i和j加上了 0、1、-1 上下坐标〖i (-1), j 0〗和〖i 1, j 0〗左右坐标〖i 0, j (-1)〗和〖i 0, j 1〗。因此需要定义两个向量坐标dx {0, 0, -1, 1}dy {-1, 1, 0, 0}。在需要访问时通过 〖row, col〗坐标和四次循环依次访问即可。算法原理本题从陆地入手先遍历原矩阵找到陆地(1)并将其在dist 距离矩阵中的对应值改为0并放入队列然后以dist 距离矩阵中的陆地(0)为起点进行 多源 BFS 即可从起点开始逐层扩展并将扩展后的值也放入队列在层序遍历的时候边扩展边记录最大的距离值返回结果细节问题我们对于最终返回的距离矩阵dist做以下操作初始化其所有值为 -1表示该位置未被访问过若某位置的值不为 -1 则说明已被访问过每一个位置的值不为 -1都表示最短距离同时也是扩展的层数在层序遍历的时候只需要通过当前位置在距离数组中对应位置的值再1就可以实现结果的更新层序遍历我们使用一个队列实现层序遍历的操作队列存储起始位置和与其上下左右相邻位置的坐标当队列不为空时一直取出队首元素获取坐标然后根据坐标向该元素的上下左右四个方向访问查找符合条件的方格坐标合法且未被访问过找到符合条件的方格之后从距离矩阵dist中取出与队首元素坐标对应位置的值再1然后将值存入当前访问位置在距离矩阵dist中的对应位置再将这个值放入队列当队列为空层序遍历完毕代码实现classSolution{publicintmaxDistance(int[][]grid){// 初始化intmgrid.length,ngrid[0].length;Queueint[]queuenewArrayDeque();int[]dx{0,0,-1,1};int[]dy{-1,1,0,0};int[][]distnewint[m][n];for(int[]arr:dist){Arrays.fill(arr,-1);// 将dist矩阵中的值初始化为-1,表示未被访问过}// 先遍历矩阵找到陆地for(inti0;im;i){for(intj0;jn;j){if(grid[i][j]1){dist[i][j]0;// 将距离矩阵中对应位置的值设置为0queue.offer(newint[]{i,j});// 放入队列}}}// 层序遍历intmaxDist-1;while(!queue.isEmpty()){int[]topqueue.poll();introwtop[0],coltop[1];for(intk0;k4;k){intxrowdx[k],ycoldy[k];if(x0xmy0yndist[x][y]-1){dist[x][y]dist[row][col]1;queue.offer(newint[]{x,y});maxDistMath.max(maxDist,dist[x][y]);}}}// 返回结果returnmaxDist;}}完

相关新闻

软件测试5 测试分类

软件测试5 测试分类

📑目录(俏皮版) 🤔为啥测试要搞这么多分类?🎯按测试目标分:我们要测软件哪些方面? 2.1 UI 界面测试|软件的 “颜值质检员”2.2 功能测试|软件会不会干活2.3 性…

2026/10/19 1:38:54 阅读更多 →
【C++ 手写 STL 容器】手撕 list 双向循环链表|迭代器模板复用 + 反向迭代器适配器 庖丁解牛

【C++ 手写 STL 容器】手撕 list 双向循环链表|迭代器模板复用 + 反向迭代器适配器 庖丁解牛

1. 整体架构预览STL std::list底层是带头结点双向循环链表。 难点不在于链表增删节点,而在迭代器封装:原生指针Node*不符合迭代器规范,需要封装迭代器类。为了避免普通迭代器、const 迭代器写两份几乎完全一样的代码,我们利用模板…

2026/10/19 1:39:35 阅读更多 →
指针妙用:从数组到字符串的灵活操作

指针妙用:从数组到字符串的灵活操作

指针如果要传的类型和指针的类型不匹配,则强转例:int a 10;char *p (char *)&a;指针——整型一维数组int a[10] {1,2,3,4};int *p &a[0]; a; 指针——字符型一维数组--主要用来存放字符串 局部作用域的一个数组 char s[] "hello";…

2026/10/19 1:40:04 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/8 1:19:03 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/7 12:08:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/8 1:35:05 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/8 1:38:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/7 12:08:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/8 1:23:14 阅读更多 →

日新闻

周新闻

月新闻