【广度优先搜索】——岛屿数量

广度优先搜索(BFS)实现思路

  1. 实现思路:
    • BFS从一个起始点开始,逐层向外扩展:先访问距离起始点最近的节点,再访问更远的节点。
    • 图的遍历中,通常用队列deque 实现广度优先搜索BFS。
  2. 一般模板:
# 调用deque
from collections import deque
def bfs(start_node, graph):visited = set()queue = deque([start_node])while queue:node = queue.popleft()if node in visited:continuevisited.add(node)# 处理当前节点process_node(node)for neighbor in graph[node]:if neighbor not in visited:queue.append(neighbor)
from collections import dequeclass   Solution:def numIslands(self, grid):# 空网格gridif not grid: return 0# 后续需要的参数rows = len(grid)cols = len(grid[0])count = 0# 向右、向左、向下、向上directions = [(1, 0), (-1, 0), (0, -1), (0, 1)]# 双层嵌套遍历所有grid所有元素for row in range(rows):for col in range(cols):if grid[row][col] == '1':       # 当前是岛屿count += 1                  # 计数queue = deque([(row, col)]) # 标记,添加当前坐标到队列中while queue:                # 如果当前队列不为空,进入一个循环r, c = queue.popleft()  # 左边元素pop,从队列取出一个位置if grid[r][c] != '1':   # 如果当前位置不是陆地continue            # 跳过这个位置grid[r][c] = '#'        # 当前位置是陆地,标记上'#'# 遍历四个方向,对于每个方向,计算新的位置(new_r, new_c)for dr, dc in directions:new_r = r + drnew_c = c + dc# 如果新位置在网格grid范围内,且是陆地if 0 <= new_r < rows and 0 <= new_c < cols and grid[new_r][new_c] == '1':# 则将该方向的新位置也加入队列,实现广度优先搜索算法queue.append((new_r, new_c))return count

以下是对上述代码涉及知识点的详细总结:

一、广度优先搜索(BFS)知识点

  1. 实现思路

    • BFS 从一个起始点开始,逐层向外扩展,先访问距离起始点最近的节点,再访问更远的节点。这是一种类似于“水波扩散”的方式,以固定的距离层次逐步探索图中的节点。
    • 在图的遍历中,通常使用队列来实现 BFS。这是因为队列具有“先进先出”的特性,非常适合模拟 BFS 的逐层扩展过程。
  2. 队列在 BFS 中的作用

    • 初始化时,将起始节点加入队列,代表从这个节点开始进行搜索。
    • 在每次循环中,从队列中取出一个节点进行处理。这个节点是当前层中最早被加入队列的节点,保证了先处理距离起始点近的节点。
    • 处理当前节点时,将其未访问过的相邻节点加入队列,这些节点将在后续的循环中被处理,从而实现了逐层向外扩展的搜索过程。
  3. 队列相关语法知识(以 Python 为例)

    • from collections import deque:导入 Python 中的deque模块,它实现了双端队列,可以高效地在两端进行添加和删除操作。
    • queue = deque([start_node]):创建一个双端队列,并将起始节点放入队列中。这里使用列表[start_node]作为参数初始化队列,是因为deque可以接受一个可迭代对象作为初始值。
    • queue.popleft():从队列的左端取出一个元素。这是队列在 BFS 中的关键操作,保证了先处理先加入队列的节点。
    • queue.append(element):将一个元素添加到队列的右端。在 BFS 中,当处理一个节点时,将其未访问过的相邻节点加入队列,以便后续进行处理。
  4. BFS 的实现过程

    • 首先,初始化一个空的集合visited用于记录已访问过的节点,避免重复访问。创建一个队列,并将起始节点加入队列。
    • 进入一个循环,只要队列不为空,就从队列中取出一个节点进行处理。如果该节点已经被访问过,则跳过;否则,将其标记为已访问,并对其进行具体的处理操作(在本题中是判断是否为陆地,如果是陆地则计数并标记为已访问)。
    • 然后,遍历当前节点的相邻节点。如果相邻节点未被访问过且满足特定条件(在本题中是在网格范围内且为陆地),则将其加入队列,以便在后续的循环中进行处理。
    • 重复这个过程,直到队列为空,此时所有可达节点都已被访问过。

二、结合本题的分析

  1. 问题解决思路

    • 本题要求计算由’1’(陆地)和’0’(水)组成的二维网格中的岛屿数量。岛屿是由相邻的陆地组成的区域,水平或垂直方向上相邻的陆地被视为同一岛屿。
    • 使用 BFS 的思路是,当遇到一个陆地时,从这个陆地开始进行广度优先搜索,将与其相连的所有陆地都标记为已访问,这样就找到了一个岛屿。然后继续遍历网格,寻找下一个未被访问的陆地,重复这个过程,直到遍历完整个网格。
  2. 代码分析

    • 首先判断特殊情况,如果输入的网格为空,则岛屿数量为 0。
    • 然后获取网格的行数和列数,初始化岛屿数量计数器count为 0。
    • 定义四个方向的偏移量directions,用于在遍历网格时快速计算相邻位置。
    • 使用两层嵌套的循环遍历整个二维网格,当遇到一个值为’1’的位置时,说明找到了一个新的陆地,岛屿数量加 1,并将该位置加入队列。
    • 进入一个循环,从队列中取出位置进行处理。如果当前位置不是陆地,则跳过;如果是陆地,将其标记为已访问。然后遍历四个方向,对于每个方向,计算新的位置。如果新位置在网格范围内且是陆地,则将其加入队列,实现广度优先搜索,将整个岛屿的陆地都标记为已访问。
    • 循环结束后,继续遍历网格,寻找下一个未被访问的陆地,重复上述过程。最后返回岛屿的数量count

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464521.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图&#xff08;Symbolic recurrence plots&#xff09;一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术&#xff0c;可用于平稳和非平稳数据集;对噪声具有…

特殊矩阵的压缩存储

一维数组的存储结构 ElemType arr[10]; 各数组元素大小相同&#xff0c;且物理上连续存放。 数组元素a[i]的存放地址 LOC i * sizeof(ElemType)。&#xff08;LOC为起始地址&#xff09; 二维数组的存储结构 ElemType b[2][4];二维数组也具有随机存取的特性&#xff08;需…

MySQL utf8mb3 和 utf8mb4引发的问题

问题描述 Cause: java.sql.SQLException: Incorrect string value: \xF4\x8F\xBB\xBF-b... for column sddd_aaa_ark at row 1 sddd_aaa_ark 存储中文字符时&#xff0c;出现上述问题 原因分析 sddd_aaa_ark在数据库中结构是 utf8字符的最大字节数是3 byte&#xff0c;但是某些…

RK3568开发板Openwrt文件系统构建

RK3568开发板Openwrt文件系统构建 iTOP-RK3568开发板使用教程更新&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 本次更新内容为《iTOP-3568开发板文件系统构建手册》&#xff0c;对Openwrt文件系统的编译…

Linux之crontab使用

一&#xff0c;查看cron是否已经在运行 查看crontab的运行状态 sudo service cron statussystemctl status cron 开启crontab: sudo service cron startsudo service cron restart 二&#xff0c;编辑cron定时任务 crontab -e加入你自己的命令&#xff0c;定时跑脚本&a…

OpenEuler 使用ffmpeg x11grab捕获屏幕流,rtsp推流,并用vlc播放

环境准备 安装x11grab(用于捕获屏幕流)和libx264(用于编码) # 基础开发环境&x11grab sudo dnf install -y \autoconf \automake \bzip2 \bzip2-devel \cmake \freetype-devel \gcc \gcc-c \git \libtool \make \mercurial \pkgconfig \zlib-devel \libX11-devel \libXext…

矩阵的奇异值分解SVD

为了论述矩阵的奇异值与奇异值分解!需要下面的结论!

H5开发指南|掌握核心技术,玩转私域营销利器

随着互联网技术的不断发展和用户需求的日益增长&#xff0c;H5页面逐渐成为了企业和个人展示信息、吸引用户关注的重要手段。具有跨平台兼容性强、网页链接分享、更新迭代方便快捷、低开发成本、可搜索和优化、数据分析与追踪、灵活性与扩展性以及无需下载安装等特点。不仅可以…

Ubuntu Linux

背景 Ubuntu起源于南非&#xff0c;其名称“Ubuntu”来源于非洲南部祖鲁语或豪萨语&#xff0c;意为“人性”、“我的存在是因为大家的存在”&#xff0c;这体现了非洲传统的一种价值观。Ubuntu由南非计算机科学家马克沙特尔沃斯&#xff08;Mark Shuttleworth&#xff09;创办…

你适合哪种tiktok广告账户类型?

TikTok在广告营销方面的分类体系极为详尽。在开设广告账户时&#xff0c;根据不同的海外市场和商品类型&#xff0c;TikTok会有各自的开户标准。此外&#xff0c;广告主所开设的TikTok广告账户类型会直接影响其可投放的广告类型。在广告出价方面&#xff0c;广告主的营销目标不…

平衡者:陈欣的宇宙使命

第一章 异象初现 2145年&#xff0c;地球已经不再是人类唯一的家园。随着科技的飞速发展&#xff0c;人类在银河系内建立了多个殖民星球。然而&#xff0c;这些新世界的繁荣背后隐藏着一个巨大的危机——各个星球之间的资源分配不均&#xff0c;导致了严重的社会动荡和冲突。 …

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…

React第十三章(useTransition)

useTransition useTransition 是 React 18 中引入的一个 Hook&#xff0c;用于管理 UI 中的过渡状态&#xff0c;特别是在处理长时间运行的状态更新时。它允许你将某些更新标记为“过渡”状态&#xff0c;这样 React 可以优先处理更重要的更新&#xff0c;比如用户输入&#x…

使用wordcloud与jieba库制作词云图

目录 一、WordCloud库 例子&#xff1a; 结果&#xff1a; 二、Jieba库 两个基本方法 jieba.cut() jieba.cut_for_serch() 关键字提取&#xff1a; jieba.analyse包 extract_tags() 一、WordCloud库 词云图&#xff0c;以视觉效果提现关键词&#xff0c;可以过滤文本…

2024年云手机推荐榜单:高性能云手机推荐

无论是手游玩家、APP测试人员&#xff0c;还是数字营销工作者&#xff0c;云手机都为他们带来了极大的便利。本文将为大家推荐几款在市场上表现优异的云手机&#xff0c;希望这篇推荐指南可以帮助大家找到最适合自己的云手机&#xff01; 1. OgPhone云手机 OgPhone云手机是一款…

Template Method(模板方法)

1)意图 定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2)结构 模板方法模式的结构图如图7-47 所示。 其中: AbstractClass(抽象类) 定义抽象的原语操作&#xff0c;具体…

自研小程序-心情追忆

在近期从繁忙的工作中暂时抽身之后&#xff0c;我决定利用这段宝贵的时间来保持我的Java技能不致生疏&#xff0c;并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face&#xff08;国内镜像站点&#xff1a;HF-Mirror&#xff09;上发现了一个关于情感分析的练习项目&…

【设计模式】策略模式定义及其实现代码示例

文章目录 一、策略模式1.1 策略模式的定义1.2 策略模式的参与者1.3 策略模式的优点1.4 策略模式的缺点1.5 策略模式的使用场景 二、策略模式简单实现2.1 案例描述2.2 实现代码 三、策略模式的代码优化3.1 优化思路3.2 抽象策略接口3.3 上下文3.4 具体策略实现类3.5 测试 参考资…

【React】初学React

A. react中如何创建元素呢&#xff1f; 说明一点&#xff1a; 属性都改为驼峰形式&#xff08;无障碍属性aria-*除外&#xff09;&#xff0c; class改成className 创建元素 B. 变量或表达式如何表示呢&#xff1f;大括号{ }包起来 变量值用大括号包裹 C. 元素和组件的区别 元素…

伦敦金价格是交易所公布的吗?

今年以来&#xff0c;伦敦金价格波动可谓是波澜壮阔&#xff0c;盘中屡次刷新历史新高&#xff0c;目前已经冲上了2700的历史大关。面对高歌猛进的伦敦金价格&#xff0c;投资者除了进行交易之外&#xff0c;还有一点相关方面的知识是想了解的。例如&#xff0c;伦敦金价格是交…