算法工程师重生之第四十四天(岛屿数量 深搜 广搜 岛屿的最大面积)

参考文献 代码随想录

一、岛屿数量

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。

后续 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述

输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。

输入示例
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
输出示例
3
提示信息

根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。

数据范围:

1 <= N, M <= 50】

深搜

版本1

direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向:上、右、下、左def dfs(grid, visited, x, y):"""对一块陆地进行深度优先遍历并标记"""for i, j in direction:next_x = x + inext_y = y + j# 下标越界,跳过if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 未访问的陆地,标记并调用深度优先搜索if not visited[next_x][next_y] and grid[next_x][next_y] == 1:visited[next_x][next_y] = Truedfs(grid, visited, next_x, next_y)if __name__ == '__main__':  # 版本一n, m = map(int, input().split())# 邻接矩阵grid = []for i in range(n):grid.append(list(map(int, input().split())))# 访问表visited = [[False] * m for _ in range(n)]res = 0for i in range(n):for j in range(m):# 判断:如果当前节点是陆地,res+1并标记访问该节点,使用深度搜索标记相邻陆地。if grid[i][j] == 1 and not visited[i][j]:res += 1visited[i][j] = Truedfs(grid, visited, i, j)print(res)

版本二

direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向:上、右、下、左def dfs(grid, visited, x, y):"""对一块陆地进行深度优先遍历并标记"""# 与版本一的差别,在调用前增加判断终止条件if visited[x][y] or grid[x][y] == 0:returnvisited[x][y] = Truefor i, j in direction:next_x = x + inext_y = y + j# 下标越界,跳过if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 由于判断条件放在了方法首部,此处直接调用dfs方法dfs(grid, visited, next_x, next_y)if __name__ == '__main__':# 版本二n, m = map(int, input().split())# 邻接矩阵grid = []for i in range(n):grid.append(list(map(int, input().split())))# 访问表visited = [[False] * m for _ in range(n)]res = 0for i in range(n):for j in range(m):# 判断:如果当前节点是陆地,res+1并标记访问该节点,使用深度搜索标记相邻陆地。if grid[i][j] == 1 and not visited[i][j]:res += 1dfs(grid, visited, i, j)print(res)

广搜

n, m = map(int, input().split())
visited = [[False] * m for i in range(n)]  # 标记哪些以及走过来,不能重复的计算
grap = []
from collections import deque
for i in range(n):grap.append(list(map(int, input().split())))
def bfs(x, y):que = deque([])que.append([x, y])while que:ix, jy = que.popleft()for next_x, next_y in direction:cur_x = ix + next_xcur_y = jy + next_yif cur_y < 0 or cur_x < 0 or cur_x >= n or cur_y >= m:continueif not visited[cur_x][cur_y] and grap[cur_x][cur_y] == 1:que.append([cur_x, cur_y])visited[cur_x][cur_y] = True
result = 0
direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]
for i in range(n):for j in range(m):if grap[i][j] == 1 and not visited[i][j]:  # 为了节省result += 1bfs(i, j) # 一旦发现陆地,将调用函数把它4周链接的给标记,为什么,因为周围的都是一个岛屿
print(result)

二、岛屿的最大面积

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。

输出描述

输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。

输入示例
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
输出示例
4
提示信息

样例输入中,岛屿的最大面积为 4。

数据范围:

1 <= M, N <= 50。

深搜

direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向:右、下、左、上def dfs(grid, visited, x, y):"""对一块陆地进行深度优先遍历,并计算岛屿的面积"""# 初始化当前岛屿的面积area = 1visited[x][y] = True  # 标记当前点为已访问for i, j in direction:next_x = x + inext_y = y + j# 下标越界,跳过if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 如果是陆地且没有被访问过,继续 DFSif grid[next_x][next_y] == 1 and not visited[next_x][next_y]:area += dfs(grid, visited, next_x, next_y)  # 递归调用 DFS,累加面积return areaif __name__ == '__main__':n, m = map(int, input().split())# 邻接矩阵grid = []for i in range(n):grid.append(list(map(int, input().split())))# 访问表visited = [[False] * m for _ in range(n)]max_area = 0  # 最大岛屿面积for i in range(n):for j in range(m):# 如果当前节点是陆地且未访问过if grid[i][j] == 1 and not visited[i][j]:# 计算岛屿面积max_area = max(max_area, dfs(grid, visited, i, j))print(max_area)

广搜

direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向:右、下、左、上
from collections import deque
def dfs(grid, visited, x, y):"""对一块陆地进行深度优先遍历,并计算岛屿的面积"""# 初始化当前岛屿的面积que = deque([])que.append([x, y])area = 1visited[x][y] = True  # 标记当前点为已访问while que:xx, yy = que.popleft()for i, j in direction:next_x = xx + inext_y = yy + j# 下标越界,跳过if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):continue# 如果是陆地且没有被访问过,继续 DFSif grid[next_x][next_y] == 1 and not visited[next_x][next_y]:visited[next_x][next_y] = Trueque.append([next_x,next_y])area += 1return areaif __name__ == '__main__':n, m = map(int, input().split())# 邻接矩阵grid = []for i in range(n):grid.append(list(map(int, input().split())))# 访问表visited = [[False] * m for _ in range(n)]max_area = 0  # 最大岛屿面积for i in range(n):for j in range(m):# 如果当前节点是陆地且未访问过if grid[i][j] == 1 and not visited[i][j]:# 计算岛屿面积max_area = max(max_area, dfs(grid, visited, i, j))print(max_area)

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

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

相关文章

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

SpringBoot+Shiro权限管理

完善之前的博客里的项目&#xff0c;本博客主要讲述Shiro的权限管理模块 代码实例 引入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.0</version>…

【C++】布隆过滤器的概念与特点解析

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 00.引入 01.布隆过滤器的概念 特点1&#xff1a;极低的内存消耗 特点2&#xff1a;快速查询 特点3&#xff1a;假阳…

深入解析:云计算与虚拟化技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 深入解析&#xff1a;云计算与虚拟化技术 文章目录 云计算概述定义服务模型部署模型 虚拟化技术定义类型关键技术 云计算与虚…

React Router v6 中用于在导航到指定路由之前使用loader预加载数据

在 React Router v6 中&#xff0c;loader 函数用于在导航到某个路由之前预加载数据。这是非常有用的功能&#xff0c;特别是在需要从服务器获取数据并将其传递给组件的情况下。loader 函数可以帮助你提前获取数据&#xff0c;从而提高用户体验和应用性能。 loader 函数的作用…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

cangjie仓颉编程语言学习Note-2.标准库学习

cangjie仓颉编程语言学习Note-2.标准库学习 当前仓颉标准库提供了几乎涵盖常见开发所使用的常见库&#xff0c;这一点很赞&#xff01; 详细模块如下&#xff1a; std: 意指标准库&#xff0c;标准库是指在编程语言中预先定义的一组函数、类、结构体等&#xff0c;旨在提供常…

时间序列预测(十八)——实现配置管理和扩展命令行参数解析器

如图&#xff0c;这是一个main,py文件&#xff0c;在此代码中&#xff0c;最开始定义了许多模型参数&#xff0c;为了使项目更加灵活和可扩展&#xff0c;便于根据不同的需求调整参数和配置&#xff0c;可以根据实际需要扩展参数和配置项。 下面是如何实现配置管理和扩展命令行…

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索&#xff1a;超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker&#xff0c;通过dockers镜像安装很方便&#xff0c;且很快&#xff1b;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像&#xff1b; docker search awvs…

QT for android 问题总结(QT 5.15.2)

1.配置好的sdk&#xff0c;显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 &#xff0c;下载一个低版本的latest &#xff0c;替换掉之前latest中的文件。即可&#xff0c;latest 路径如…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

软件测试基础九 (python基础)

python基础 1. 注释 1.1. 注释的作⽤ 使⽤⾃⼰熟悉的语⾔&#xff0c;在程序中对某些代码进⾏标注说明&#xff0c;增强程序的可读性。 1.2. 单⾏注释 以# 开头&#xff0c;# 右边的所有东⻄都被当做说明⽂字&#xff0c;⽽不是真正要执⾏的程序&#xff0c;只起到辅助说明…

使用Kafka构建大规模消息传递系统

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Kafka构建大规模消息传递系统 引言 Kafka 简介 安装 Kafka 创建主题 生产者 消费者 高级特性 分区 持久化 消费者组 消息确认…

AI 大模型重塑软件开发流程的未来

目录 前言1. AI 大模型简介2. AI 大模型在软件开发中的应用场景2.1 代码自动生成2.2 智能调试与错误检测2.3 软件测试的自动化2.4 文档生成与代码注释 3. AI 大模型对软件开发的优势3.1 提高开发效率3.2 提升代码质量与一致性3.3 降低学习成本 4. AI 大模型在软件开发中面临的挑…

docker镜像获取不到的问题处理

总结 国内源的限制&#xff0c;很多镜像pull失败。 我目前使用的感觉最合理的方式就是去云平台厂商买一个香港的云主机。使用弹性模式&#xff0c;就是一小时几毛钱的那种。 然后pull镜像&#xff0c;pull成功后&#xff0c;save到本地&#xff0c;然后用xshell下载下来。因为…

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…

求平面连接线段组成的所有最小闭合区间

这个功能确实非常实用&#xff0c;我在过去开发地面分区编辑器时就曾应用过这一算法。最近&#xff0c;在新产品的开发中再次遇到了类似的需求。尽管之前已经实现过&#xff0c;但由于长时间未接触&#xff0c;对算法的具体细节有所遗忘&#xff0c;导致重新编写时耗费了不少时…

【P2-7】ESP8266 WIFI模块在AP模式下实现UDP与电脑/手机网络助手通信——UDP数据透传

前言:完成ESP8266 WIFI模块在AP模式下实现UDP与电脑/手机网络助手通信——实现UDP数据透传 AP模式,通俗来说模块可以发出一个WIFI热点提供给电脑/手机连接。 UDP协议,是传输层协议,UDP没有服务器和客户端的说法。 演示视频: ESP8266 WIFI模块在AP模式下实现UDP与电脑/手机…

金箍棒变化-第15届蓝桥杯国赛Scratch初/中级组真题第1题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第193讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…