多源BFS问题(4)_地图分析

ops/2024/11/1 21:58:20/

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

多源BFS问题(4)_地图分析

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌
    

目录

1. 题目链接 

2. 题目描述

3. 解法

算法思路 :

代码展示 :

4. 算法总结 


1. 题目链接 

OJ链接 : 地图分析

2. 题目描述

你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。

示例 1:

输入:grid = [[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。

示例 2:

输入:grid = [[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释: 
海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j] 不是 0 就是 1

3. 解法

算法思路 :

01 矩阵的变型题, 直接用多源bfs解决即可.

 

代码展示 :

class Solution 
{int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:int maxDistance(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<int>>dist(n, vector<int>(m, -1));queue<pair<int, int>> q; for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(grid[i][j] == 1) {q.push({i, j});dist[i][j] = 0;}  int ret = 0;while(q.size()){auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; i++){int x = dx[i] + a, y = dy[i] + b;if(x >= 0 && x < n && y >= 0 && y < m && dist[x][y] == -1){q.push({x, y});dist[x][y] = dist[a][b] + 1;ret = max(ret, dist[x][y]);}}}if(ret) return ret;else return -1;}
};

 

4. 算法总结 

1. 初始化:
dx 和 dy 数组定义了四个方向的移动(右、左、下、上)。
n 和 m 分别代表网格的行数和列数。
创建一个二维 dist 数组,用于记录每个位置到最近的陆地的距离,初始值为 - 1。
使用一个队列 q 来执行广度优先搜索(BFS)。

2. 入队陆地位置:
遍历整个网格,将所有陆地(值为1)的坐标入队,并将其在 dist 中的距离设为0。

3. BFS遍历:
当队列不为空时,取出队首元素(a, b)。
对于每个方向,计算新坐标(x, y)。
如果(x, y) 在网格内且尚未访问(dist[x][y] == -1),将其入队,并更新其距离为 dist[a][b] + 1。
更新最大距离 ret。

4. 返回结果:
最后,如果 ret 大于0,返回最大距离;否则返回 - 1,表示不存在海洋。


http://www.ppmy.cn/ops/130246.html

相关文章

webrtc agc2实现原理

WebRTC的AGC2&#xff08;自适应增益控制器&#xff09;是一种用于音频处理的算法&#xff0c;可以根据输入信号的强度自动调整增益&#xff0c;使输出信号的音量保持稳定。其详细原理如下&#xff1a; 噪声估计 首先&#xff0c;AGC2需要对输入信号中的噪声进行估计&#xff…

【AIGC】深入探索『后退一步』提示技巧:激发ChatGPT的智慧潜力

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;“后退一步”技巧介绍技巧目的 &#x1f4af;“后退一步”原理“后退一步”提示技巧与COT和TOT的对比实验验证 &#x1f4af;如何应用“后退一步”策略强调抽象思考引导提…

Sublime Text 的PHP格式化插件phpfmt 的 setting 配置参数说明

phpfmt.sublime-settings 是 Sublime Text 中 phpfmt 插件的配置文件&#xff0c;用于定义代码格式化的各种参数。以下是一些常见的配置参数及其说明&#xff1a; 1、version 指定配置文件的版本&#xff0c;根据 phpfmt 插件的版本&#xff0c;此值可能有所不同。 2、php_b…

skynet的cluster集群

集群的使用 现在的游戏服务器框架中&#xff0c;分布式是一种常见的需求。一个游戏服务器组通常可以分成网关服务器、登录服务器、逻辑服务器、跨服服务器等等。 在skynet中&#xff0c;我们可以通过cluster来组建一个集群&#xff0c;实现分布式的部署。 示例 我们先来看一…

WPF+MVVM案例实战(八)- 自定义开关控件封装实现

文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现4、源代码获取1、案例运行效果 2、项目准备 打开项目 Wpf_Examples,新建ToggleButtonWindow.xma…

李彦宏《应用来了》主题演讲海报官宣,百度世界或带来多个新发布

发布 | 大力财经 10月31日&#xff0c;百度官方微博对外发布了百度创始人李彦宏的主题演讲海报&#xff0c;显示在11月12日的百度世界2024&#xff0c;他将带来长达1个小时的重磅主题演讲。海报背景上的文案来自于李彦宏在近期演讲中提及的AI行业观点&#xff0c;或预示着他将…

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风

TLV320AIC3104 是一款低功耗立体声音频编解码器&#xff0c;具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制&#xff0c;可实现立体声 48kHz DAC 回放&#xff0c;在 3.3V 模拟电源电压下的功耗低至 14mW&#xff0…

【PGCCC】Postgresql 动态哈希表实现

结构图 hash 表包含了多个 segment 切片&#xff0c;每个 segment 包含了相同数量的 bucket。里面的 bucket 使用链表存储着 hash 值相同的元素。 当查找指定的 key 时&#xff0c;首先计算出它的哈希值&#xff0c;然后根据后面的几位数&#xff0c;计算出对应的 bucket 位置…