代码随想录算法训练营第51天|101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104.建造最大岛屿

news2024/10/23 0:33:17

文章目录

  • 101. 孤岛的总面积
  • 102. 沉没孤岛
  • 103. 水流问题
  • 104.建造最大岛屿

101. 孤岛的总面积

卡码网 101. 孤岛的总面积
代码随想录

from collections import deque
n, m = map(int, input().split())

matrix = []

for i in range(n):
    matrix.append(list(map(int, input().split())))

visited = [[False] * m for _ in range(n)]

directions = [[1,0],[-1,0],[0,-1],[0,1]]


def bfs(matrix, visited, x, y):
    area = 1
    que = deque([])
    que.append([x,y])
    flag = False
    while que:
        # 弹出一个点
        cur_x, cur_y = que.popleft()
        
        if cur_x == 0 or cur_x == len(matrix)-1 or cur_y ==0 or cur_y == len(matrix[0])-1:
            flag = True # 计算面积的同时判断是不是处理边界,如果是处于边界的话,就多返回一个true,只有不是边界的情况下才加到总面积上去。
        # 四个方向遍历(四个方向)
        for i, j in directions:
            next_x = cur_x + i
            next_y = cur_y + j
            if next_x < 0 or next_x >= len(matrix) or next_y < 0 or next_y >= len(matrix[0]):
                continue
            if not visited[next_x][next_y] and matrix[next_x][next_y] == 1:
                visited[next_x][next_y] = True
                que.append([next_x, next_y])
                area += 1
    return flag, area
res = 0

for i in range(n):
    for j in range(m):
        if matrix[i][j] == 1 and not visited[i][j]:
            visited[i][j] = True
            flag, area = bfs(matrix, visited, i, j)
            if not flag:
                res += area
            # if bfs(matrix, visited, i, j)  == 1:
            #     res += 1
print(res)

102. 沉没孤岛

卡码网 102. 沉没孤岛
代码随想录

from collections import deque
n, m = map(int, input().split())

matrix = []

for i in range(n):
    matrix.append(list(map(int, input().split())))

visited = [[False] * m for _ in range(n)]

directions = [[1,0],[-1,0],[0,-1],[0,1]]


def bfs(matrix, visited, x, y):
    area = 1
    que = deque([])
    que.append([x,y])
    flag = False
    back_up = deque([])
    while que:
        # 弹出一个点
        cur_x, cur_y = que.popleft()
        # 把遍历的所有点就记录下来,如果确定是一个孤岛,把这些左边置为0
        back_up.append([cur_x, cur_y])
        if cur_x == 0 or cur_x == len(matrix)-1 or cur_y ==0 or cur_y == len(matrix[0])-1:
            flag = True
        # 四个方向遍历(四个方向)
        for i, j in directions:
            next_x = cur_x + i
            next_y = cur_y + j
            if next_x < 0 or next_x >= len(matrix) or next_y < 0 or next_y >= len(matrix[0]):
                continue
            if not visited[next_x][next_y] and matrix[next_x][next_y] == 1:
                visited[next_x][next_y] = True
                que.append([next_x, next_y])
                area += 1
    if not flag:
        while back_up:
            cur_x, cur_y = back_up.popleft()
            matrix[cur_x][cur_y] = 0
            
    # return flag, area
res = 0

for i in range(n):
    for j in range(m):
        if matrix[i][j] == 1 and not visited[i][j]:
            visited[i][j] = True
            bfs(matrix, visited, i, j)
# print(res)
for i in range(len(matrix)):
    # print(" ".jion(map(str, matrix[i])))
    print(" ".join([str(item) for item in matrix[i]]).strip())

103. 水流问题

卡码网 103. 水流问题
代码随想录

from collections import deque
n, m = map(int, input().split())
 
matrix = []
 
for i in range(n):
    matrix.append(list(map(int, input().split())))
 
visited = [[False] * m for _ in range(n)]
 
directions = [[1,0],[-1,0],[0,-1],[0,1]]
 
first = set()
second = set()
 
def dfs(matrix, visited, x, y, node):
    if visited[x][y]:
        return
     
    node.add((x,y))
    visited[x][y] = True
     
    for i, j in directions:
        next_x = x + i
        next_y = y + j
        if (0 <= next_x < len(matrix) 
        and 0<= next_y < len(matrix[0]) 
        and matrix[next_x][next_y] >= matrix[x][y]):
            dfs(matrix, visited, next_x, next_y, node)
 
# 右/上
for i in range(len(matrix)):
    dfs(matrix, visited, i, 0, first)
for j in range(len(matrix[0])):
    dfs(matrix, visited, 0, j, first)
# print(first)
 
# visited需要重新初始化
visited = [[False] * m for _ in range(n)]
for i in range(len(matrix)):
    dfs(matrix, visited, i, len(matrix[0])-1, second)
for j in range(len(matrix[0])):
    dfs(matrix, visited, len(matrix)-1, j, second)
# print(second)
     
res = first & second
# print(res)
 
for x,y in res:
    print(f'{x} {y}')

104.建造最大岛屿

卡码网 104.建造最大岛屿
代码随想录

from collections import deque
n,m = map(int, input().split())

matrix = []

for i in range(n):
    matrix.append(list(map(int, input().split())))
# 记录遍历
visited = [[False]*m for _ in range(n)]
# 记录岛屿编号
marked = [[0]*m for i in range(n)]

directions = [[-1,0],[1,0],[0,-1],[0,1]]

def bfs(matrix, visited, x, y, marked, isoland_cnt):
    area = 1
    que = deque([])
    que.append([x,y])
    # 记录新的岛屿
    marked[x][y] = isoland_cnt
    while que:
        cur_x, cur_y = que.popleft()
        for i, j in directions:
            next_x = cur_x + i
            next_y = cur_y + j
            if next_x < 0 or next_x >= len(matrix) or next_y < 0 or next_y >= len(matrix[0]):
                continue
            if not visited[next_x][next_y] and matrix[next_x][next_y] == 1:
                visited[next_x][next_y] = True
                marked[next_x][next_y] = isoland_cnt
                que.append([next_x, next_y])
                area += 1
    return area

isoland_cnt = 1
area_dict = dict()
for i in range(n):
    for j in range(m):
        if matrix[i][j] == 1 and not visited[i][j]:
            visited[i][j] = True
            area = bfs(matrix, visited, i, j, marked, isoland_cnt)
            area_dict[isoland_cnt] = area
            isoland_cnt += 1

res = 0
# 开始填充
for i in range(n):
    for j in range(m):
        if marked[i][j] == 0:
            max_area = 1
            isoland_set = set()
            for x,y in directions:
                next_x = x + i
                next_y = y + j
                if (
                    0<= next_x < n and 
                    0 <= next_y < m and 
                    marked[next_x][next_y] != 0 and 
                    marked[next_x][next_y] not in isoland_set
                ):
                    max_area += area_dict[marked[next_x][next_y]]
                    isoland_set.add(marked[next_x][next_y])
            res = max(max_area, res)
if res == 0:
    print(n*m)
else:
    print(res)

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

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

相关文章

vue3 解决背景图与窗口留有间隙的问题

需要实现一个登录界面&#xff0c;login.vue的代码如下&#xff1a; <script> import { ref } from vue;export default {setup() {return {};}, }; </script><template><div id"login-container" class"login-container"><di…

Taro构建的H5页面路由切换返回上一页存在白屏页面过渡

目录 项目背景&#xff1a;Taro与Hybrid开发问题描述&#xff1a;白屏现象可能的原因包括&#xff1a; 解决方案解决后的效果图 其他优化方案可参考&#xff1a; 项目背景&#xff1a;Taro与Hybrid开发 项目使用Taro框架同时开发微信小程序和H5页面&#xff0c;其中H5页面被嵌…

Nodes 节点

Goto Tree List 树列表 Nodes 节点 Tree List 节点是组织成树状层次结构的数据行。 Add New Nodes 添加新节点 如果 Tree List 具有数据源&#xff0c;则会自动生成节点&#xff08;TreeListNode 类对象&#xff09;。要在未绑定模式下添加节点&#xff0c;请调用“树列表设…

【K8S系列】Kubernetes Pod节点Pending状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 Pending 表示 Pod 已被创建&#xff0c;但尚未被调度到节点上&#xff0c;或者已调度到节点上但容器尚未开始运行。这一状态常常是因为某些条件未满足&#xff0c;导致 Pod 无法正常启动。以下是对 Pending 状态的详细分析及解决方案…

自由学习记录(12)

综合实践 2D的Shape&#xff0c;Tilemap都要导包的&#xff0c;编辑器也要导包&#xff0c;。。和2d沾边的可能3d都要主动导包 应该综合的去运用&#xff0c;不见得Tilemap就很万能&#xff0c;如果要做什么顶方块的有交互反应的物体&#xff0c; 那直接拖Sprite会更方便一些…

APIJSON 为零代码提供了新的思路

APIJSON 核心概念 APIJSON 是一种用于构建 RESTful API 的 JSON 格式&#xff0c;它提供了一种标准化的方式来定义和处理 API 请求和响应。APIJSON 的设计目标是简化前端和后端之间的数据交互&#xff0c;减少开发工作量&#xff0c;提高开发效率。 在线解析 自动生成文档&am…

【SpringBoot】16 文件上传(Thymeleaf + MySQL)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 文件上传是指将本地的图片、视频、音频等文件上传到服务器&#xff0c;供其他用户浏览下载的过程&#xff0c;文件上传在日常项目中用的非常广泛。 实现代码 第一步&#xff1a;在配置文件新增如下配置 application.yml s…

docker-compose-lnmp-wordpress

使用 docker-compose 在 CentOS 7 上编写并部署 LNMP (Linux, Nginx, MySQL, PHP) 环境的 YAML 文章目录 部署步骤&#xff1a;1. 安装 Docker 和 Docker Compose1.1安装 Docker&#xff1a;1.2安装 Docker Compose&#xff1a; 2.创建目录结构3.编写docker-compose.yml4.ngin…

Java项目-基于springboot框架的财务管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

科研进展 | RSE:全波形高光谱激光雷达数据Rclonte系列处理算法一

《环境遥感》&#xff08;Remote Sensing of Environment&#xff0c;IF11.1&#xff09;近日发表一项来自中国科学院空天信息创新研究院王力、牛铮研究员团队的全波形高光谱激光雷达&#xff08;hyperspectral LiDAR&#xff0c;HSL&#xff09;数据处理算法研究&#xff0c;论…

计算机组成原理一句话

文章目录 计算机系统概述存储系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&#xff…

DC系列靶机-DC6

一&#xff0c;环境的搭建 VM17 官网下载 kali 2023.4版 https://mirrors.tuna.tsinghua.edu.cn/kali-images/kali-2023.4/ 靶场文件 https://download.vulnhub.com/dc/DC-6.zip 二&#xff0c;攻略 首先进行主机发现&#xff1b; 接下来进行端口扫描&#xff1b; 开放了2…

初识git · 远程操作

目录 前言&#xff1a; 理解分布式版本控制系统 远程仓库 仓库操作 克隆仓库 推送和抓取 特殊文件 取别名 标签管理 前言&#xff1a; 在基本操作&#xff0c;分支管理这几个部分&#xff0c;我们都会在本地仓库操作了&#xff0c;但是目前还没有办法将自己的代码远程…

uniapp 实现input聚焦时选中内容(已封装)兼容微信小程序

老规矩先来看看效果噻&#xff01; 从上面的录屏中我们可以看出&#xff0c;要实现input自由选中内容的功能是可以实现的&#xff0c;原理其实很简单。 直接运行即可 <template><view><!-- <input class"psd"type"digit" :value"in…

第二代 GPT-SoVITS V2:解锁语音克隆与合成的无限可能

在 AI 技术蓬勃发展的今天&#xff0c;第二代 GPT-SoVITS V2 如一颗璀璨的明星闪耀登场&#xff0c;为语音处理领域带来了前所未有的变革。它是一款集先进技术与强大功能于一身的声音克隆与语音合成工具&#xff0c;由 RVC 变声器创始人 “花儿不哭” 与 AI 音色转换技术 Sovit…

当小程序学会‘读心术’:表单处理的神秘法则

哈喽&#xff0c;我是阿佑&#xff0c;今天将给大家给咱们的小程序赋能——“读心术”&#xff01; 文章目录 微信小程序的表单处理表单元素&#xff1a;小程序的“语言”表单事件&#xff1a;小程序的“听觉”表单提交&#xff1a;小程序的“表达”总结 微信小程序的表单处理 …

Oracle数据库系统表空间过大,清理SYSTEM、SYSAUX表空间

一.前言 在oracle数据库中&#xff0c;system为系统表空间&#xff0c;存放着一些我们经常用到的系统表和视图&#xff0c;sysaux为辅助表空间&#xff0c;辅助着系统表空间。这两个表空间不宜添加数据文件&#xff0c;会使系统表空间过于臃肿&#xff0c;从而影响数据库的使用…

【Jenkins】2024 最新版本的 Jenkins 权限修改为 root 用户启动,解决 permission-denied 报错问题

最新版本的 Jenkins 修改 /etc/sysconfig/jenkins 中的 JENKINS_USERroot不会再生效&#xff0c;需要按照以下配置进行操作&#xff1a; vim /usr/lib/systemd/system/jenkins.service然后重启就可以了 systemctl daemon-reload # 重新加载 systemd 的配置文件 systemctl res…

Shell编程-案例一(数据库备份服务监测)

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令&#xff0c;以及涉及到部分逻辑判断的问题。从简单来说&#xff0c;他就是Shell编程&#xff0c;…

基于Multisim三极管B放大系数放大倍数测量电路设计(含仿真和报告)

【全套资料.zip】三极管B放大系数放大倍数测量电路电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.用三个数码管显示B的大小&#xff0c;分别显示个位、十位和百位。 2.显示范围…