算法工程师第四十四天(99. 岛屿数量 深搜 99. 岛屿数量 广搜 100.岛屿的最大面积 )

news2024/9/19 9:36:22

参考文献 代码随想录

一、岛屿数量

题目描述

给定一个由 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

思路分析:遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。再遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

深搜版本:

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)]  # 标记哪些已经走过的
direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向:上、右、下、左  


def dfs(x, y):
    for i, j in direction:  # 从开始的这个点往周围搜
        x_nex = x +  i
        y_nex=  y + j
        if x_nex < 0 or x_nex >= len(grid) or y_nex < 0 or y_nex >= len(grid[0]):  # 一旦x,或者说是y发现超出范围,则不需要往下走,
            continue
        if not visited[x_nex][y_nex] and grid[x_nex][y_nex] == 1:  # 如果当前的路并没有走过,那么就从当前点出发,并对对应的标记为true
            visited[x_nex][y_nex] = True
            dfs(x_nex, y_nex)
res = 0
for i in range(n):
    for j in range(m):
        if grid[i][j] == 1 and not visited[i][j]:  # 如果为陆地,并且没有被访问过,那么就要调用深搜模版去寻当前节点周围的陆地
            res += 1  # 一旦发现新的路段,那么结果就要加1
            visited[i][j] = True  同时把当前的坐标开始搜索并标记为已经走过
            dfs(i, j)
print(res)

广搜:

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)]
direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向:上、右、下、左

def bfs(x, y):
    from collections import deque
    queen = deque()
    queen.append([x, y])
    visited[x][y] = True
    while queen:
        cur_x, cur_y = queen.popleft() 
        for i, j in direction:
            x_nex = cur_x +  i
            y_nex=  cur_y + j
            if x_nex < 0 or x_nex >= len(grid) or y_nex < 0 or y_nex >= len(grid[0]):
                continue
            if not visited[x_nex][y_nex] and grid[x_nex][y_nex] == 1:
                queen.append([x_nex, y_nex])
                visited[x_nex][y_nex] = True
                
res = 0
for i in range(n):
    for j in range(m):
        if grid[i][j] == 1 and not visited[i][j]:
            res += 1
            bfs(i, j)
print(res)

二、岛屿的最大面积

题目描述

给定一个由 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。

深搜:

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)]
directions = [[0,-1], [0, 1],[-1,0],[1,0]]  # 每个点的方向
res = 0
count = 0
def dfs(x, y):
    global count # 定义全句变量
    for i, j in directions:  # 从当前点遍历到走位的陆地
        nex_x = x + i  
        nex_y = y + j
        if nex_y < 0 or nex_x < 0 or nex_x >= len(grid) or nex_y >= len(grid[0]):
            continue  # 越界了
        if grid[nex_x][nex_y] == 1 and not visited[nex_x][nex_y]:  # 当前是陆地并且没有被方访问过
            visited[nex_x][nex_y] = True
            count += 1
            dfs(nex_x, nex_y)
for i in range(n):
    for j in range(m):
        if not visited[i][j] and grid[i][j] == 1:
            visited[i][j] = True  # 
            count = 1
            dfs(i, j)
            res = max(res, count)
            
print(res)

广搜:

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)]
directions = [[0,-1], [0, 1],[-1,0],[1,0]]  # 每个点的方向
res = 0
count = 0
def bfs(x, y):
    from  collections import deque
    queen = deque()
    queen.append([x, y])
    global count # 定义全句变量
    while queen:
        cur_x, cur_y = queen.popleft()
        for i, j in directions:  # 从当前点遍历到走位的陆地
            nex_x = cur_x + i  
            nex_y = cur_y + j
            if nex_y < 0 or nex_x < 0 or nex_x >= len(grid) or nex_y >= len(grid[0]):
                continue  # 越界了
            if grid[nex_x][nex_y] == 1 and not visited[nex_x][nex_y]:  # 当前是陆地并且没有被方访问过
                visited[nex_x][nex_y] = True
                count += 1
                queen.append([nex_x, nex_y])
for i in range(n):
    for j in range(m):
        if not visited[i][j] and grid[i][j] == 1:
            visited[i][j] = True  # 
            count = 1
            bfs(i, j)
            res = max(res, count)
            
print(res)

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

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

相关文章

Android 安卓Compose软键盘和Activity页面的协调处理问题

文章目录 问题展示1、输入框展示不完整&#xff0c;且布局被顶出屏幕外2、输入框被软键盘完全覆盖 解决方案最终演示 问题展示 1、输入框展示不完整&#xff0c;且布局被顶出屏幕外 这是默认处理的样式 2、输入框被软键盘完全覆盖 当在AndroidManifest.xml Activity标签上加…

天龙八部万象归一第8版单机安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;天龙八部万象归一第8版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对…

火影忍者2——漩涡鸣人(仙人模式)篇

老规矩&#xff0c;谈火影~ 火影忍者 之—— 漩涡鸣人&#xff08;仙人模式&#xff09;篇 众所周知&#xff0c;鸣仙是一个早期的A忍&#xff0c;技能破坏力贼大&#xff0c;一般遇到鸣仙&#xff08;除非我用了青水神卡&#xff09;我是直接退的 普攻 一技能 螺旋丸 普…

深信服应届生客户经理面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

如何使用mmdetection训练实例分割模型?

安装 anoconda 从官方网站下载并安装。 配置环境 conda create --name openmmlab python3.8 -y conda activate mmdet 安装 PyTorch 注意&#xff1a;这个步骤很关键&#xff0c;否则后面会出问题。一定要确保自己电脑当前安装和配置的cuda版本。 使用命令&#xff1a;nvcc …

3.1 I-pipe四行启动代码

Interrupt Pipeline系列文章大纲-CSDN博客 I-pipe的启动代码位于init/main.c: start_kernel函数中。可以看到代码提交是集中在patch: genirq: add generic I-pipe core (8f933b57) 提交 xenomai / ipipe-arm64 GitLab (denx.de)&#xff0c;主要是四行&#xff1a; &#x…

stm32—SPI

1. SPI SPI (Serial Peripheral Interface)&#xff1a;是由美国摩托罗拉公司(Motorala)最先推出的一种同步全双工串行传输规范&#xff0c;也是一种单片机外设芯片串行扩展接口 SPI 接口主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c; AD转换器&#xf…

ORM底层的原理

2.3.面试题3&#xff1a;请介绍什么是ORM思想&#xff1a; a.什么是ORM&#xff1a; 1.所谓的ORM是Dao层的一种思想&#xff0c;意思就是对象关系映射&#xff08;英语&#xff1a;Object Relational Mapping&#xff0c;简称ORM&#xff0c;或O/RM&#xff0c;或O/R mapping…

【回文数判断】输入一个5位数,判断它是不是回文数

输入一个5位数&#xff0c;判断它是不是回文数。例如12321是回文数&#xff0c;个位和万位相同&#xff0c;十位与千位相同 使用C语言实现&#xff0c;具体代码&#xff1a; #include<stdio.h>int main(){int a,b,c,d,x;printf("输入一个5位数&#xff1a;")…

ACCESS 注入实战

简介 Access数据库注入攻击是一种常见的网络安全&#xff0c;通过注入SQL代码来获取未授权的数据访问权限。这种攻击利用了应用程序与数据库之间的交互漏洞&#xff0c;攻击者通过输入特定的SQL代码片段来操纵数据库查询&#xff0c;从而绕过应用程序的安全机制&#xff0c;获取…

中移动集团SRE人员能力提升培训圆满结课

前言&#xff1a; ​在数字化转型的浪潮中&#xff0c;中移动作为通信行业的领军企业&#xff0c;面临着日益复杂的运维挑战。SRE&#xff08;Site Reliability Engineering&#xff09;作为一种新兴的运维理念&#xff0c;为中移动提供了解决这些问题的新思路。2024年7月下旬…

OpenCV几何图像变换(7)重映射函数 remap()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用一个通用的几何变换到图像上。 remap 函数使用指定的地图对源图像进行变换&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p …

VulnStack2-主机不出网-黄金票据-SID History

网络结构 kali192.168.20.145DC10.10.10.10PC192.168.20.201/10.10.10.201WEB192.168.20.80/10.10.10.80 WEB登录时&#xff0c;切到V1.3快照 且不登录默认用户 开启weblogic服务 漏洞利用 访问Weblogic默认的console路由http://192.168.20.80:7001/console 直接用工具打一…

深信服研发面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

新手友好:易于上手的10款项目管理工具推荐

国内外主流的 10 款轻量级项目管理软件对比&#xff1a;PingCode、Worktile、Coding、致远OA、Gitee、Wrike、ClickUp、Notion、Airtable、Basecamp。 在快节奏的工作环境中&#xff0c;有效的项目管理是成功的关键&#xff0c;尤其是对于资源有限的小型团队和初创公司而言。轻…

golang实现一个简单的rpc框架

前言 RPC在分布式系统中经常使用&#xff0c;这里写一个简单的demo实践一下。 code 先生成 go.mod 文件 go mod init rpc-try01定义方法 package model// Args 是 RPC 方法的参数结构体 type Args struct {A, B int }// Arith 定义了一个简单的算术服务 type Arith struct{…

解锁 Vue 3 Teleport 的魔力

偶然遇到一个场景&#xff0c;在项目开发中蒙层是很常见的一个组件&#xff0c;我们期望它会在 body 下显示&#xff0c;但有时候代码逻辑结构很合理&#xff0c;组件结构不是很合理&#xff0c;也就是说蒙层组件不在 body 下&#xff0c;比如说&#xff1a; 蒙层组件 <te…

初识网络--网络基础概念

目录 1 网络的发展 2 协议 ​编辑 3 网络传输的流程 局域网 跨网络通信 1 网络的发展 计算机是被人设计出来&#xff0c;为人提供计算服务的&#xff0c;而人是需要协作的&#xff0c;那么就注定计算机之间也必须要协作&#xff0c;计算机之间的协作就是靠互通数据来完成…

MySQL的源码安装

目录 1 编译前的准备 1.1 安装cmake 1.2 安装gcc 2 源码编译安装 2.1 使用cmake检查环境并指定路径 2.2 使用 make 进行源码编译 2.3 使用 make install 安装MySQL 3 MySQL源码安装环境配置 3.1 创建mysql 用户 3.2 编辑my.cnf 文件 3.3 conkconfig 创建开机自启服务 3.4 配置…

这 2 个 GitHub 项目,YYDS!

01 &#x1f9e0; 构建你的第二大脑&#xff1a;SuperMemory 在这个信息爆炸的时代&#xff0c;我们每天都在互联网上浏览和保存大量的信息&#xff0c;但往往这些宝贵的数据就像被扔进了黑洞&#xff0c;再也没有被回顾和利用。 SuperMemory 开源项目应运而生&#xff0c;旨在…