【代码随想录训练营】【Day 66】【图论-3】| 卡码 101-104

【代码随想录训练营】【Day 66】【图论-3】| 卡码 101-104

需强化知识点

  • 103,104 优化思路

题目

101. 孤岛的总面积

  • 此处 area 多余
def dfs(grid, x, y, area):dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n = len(grid), len(grid[0])area[0] += 1grid[x][y] = 0for add_x, add_y in dirs:next_x, next_y = x + add_x, y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y]:dfs(grid, next_x, next_y, area)tmp = list(map(int, input().split()))
m, n = tmp[0], tmp[1]
grid = [[0] * n for _ in range(m)]for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]for i in range(m):if grid[i][0]:dfs(grid, i, 0, [0])if grid[i][n-1]:dfs(grid, i, n-1, [0])for j in range(n):if grid[0][j]:dfs(grid, 0, j, [0])if grid[m-1][j]:dfs(grid, m-1, j, [0])cur = 0
for i in range(m):for j in range(n):if grid[i][j]:cur += 1print(cur)          

102. 沉没孤岛

  • 思路:从左右上下边界出发遍历,然后visited数组标记,最后 grid 为 1 且没被访问过的,即为孤岛
import collectionsdef bfs(grid, visited, x, y):dirs = [[1, 0], [0, 1], [-1, 0], [0, -1]]m, n = len(grid), len(grid[0])que = collections.deque()que.append([x, y])visited[x][y] = Truewhile que:tmp = que.popleft()cur_x, cur_y = tmp[0], tmp[1]for add_x, add_y in dirs:next_x, next_y = cur_x + add_x, cur_y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y] and not visited[next_x][next_y]:que.append([next_x, next_y])visited[next_x][next_y] = Truetmp = list(map(int, input().split()))
m, n = tmp[0], tmp[1]
grid = [[0] * n for _ in range(m)]
visited = [[False] * n for _ in range(m)]for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]for i in range(m):if grid[i][0]:bfs(grid, visited ,i, 0)if grid[i][n-1]:bfs(grid, visited, i, n-1)for j in range(n):if grid[0][j]:bfs(grid, visited, 0, j)if grid[m-1][j]:bfs(grid, visited, m-1, j)for i in range(m):for j in range(n):if grid[i][j] and not visited[i][j]:grid[i][j] = 0for i in range(m):for j in range(n):print(grid[i][j], end=" ")

103. 水流问题

  • 暴力法:直接每个位置 dfs,然后根据其最终是否能到达边界位置,返回布尔值
  • 优化思路:从边界出发,逆流而上,最终不能被访问到的地方为结果
# def dfs(grid, visited, x, y):
#     dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]#     m, n = len(grid), len(grid[0])
#     visited[x][y] = True#     for add_x, add_y in dirs:
#         next_x, next_y = x + add_x, y + add_y
#         if next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:
#             continue
#         if grid[x][y] < grid[next_x][next_y]:
#             continue
#         if not visited[next_x][next_y]:
#             dfs(grid, visited, next_x, next_y)# def isResult(grid, x, y):
#     m, n = len(grid), len(grid[0])
#     visited = [[False] * n for _ in range(m)]
#     dfs(grid, visited, x, y)
#     first_result, second_result = False, False#     for i in range(m):
#         if visited[i][0]:
#             first_result = True
#         if visited[i][n-1]:
#             second_result = True#     for j in range(n):
#         if visited[0][j]:
#             first_result = True
#         if visited[m-1][j]:
#             second_result = True#     return first_result and second_result# tmp = list(map(int, input().split()))
# m, n = tmp[0], tmp[1]# grid = [[0] * n for _ in range(m)]
# for i in range(m):
#     tmp = list(map(int, input().split()))
#     for j in range(n):
#         grid[i][j] = tmp[j]# for i in range(m):
#     for j in range(n):
#         if isResult(grid, i, j):
#             print("{} {}".format(i, j))def dfs(grid, visited, x, y):dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n = len(grid), len(grid[0])visited[x][y] = Truefor add_x, add_y in dirs:next_x, next_y = x + add_x, y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continue# 等于不行if grid[x][y] > grid[next_x][next_y]:continueif not visited[next_x][next_y]:dfs(grid, visited, next_x, next_y)tmp = list(map(int, input().split()))
m, n = tmp[0], tmp[1]grid = [[0] * n for _ in range(m)]
for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]   visited_first = [[False]*n for _ in range(m)]
visited_second = [[False]*n for _ in range(m)]for i in range(m):dfs(grid, visited_first, i, 0)dfs(grid, visited_second, i, n-1)for j in range(n):dfs(grid, visited_first, 0, j)dfs(grid, visited_second, m-1, j)for i in range(m):for j in range(n):if visited_first[i][j] and visited_second[i][j]:print("{} {}".format(i, j))

104. 建造最大岛屿

  • 暴力法:直接每个为0的位置,dfs,记录其面积
  • 优化思路:先记录每个岛屿的面积,并编号,然后 每个为0的位置,假设其为1,然后加上周围能访问到岛屿面积
    • 注意周围访问岛屿的去重问题,以及为grid 0的情况
def dfs(grid, mask, x, y, count):dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n = len(grid), len(grid[0])grid[x][y] = maskcount[0] += 1for add_x, add_y in dirs:next_x, next_y = x + add_x, y + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y] != 1 :continuedfs(grid, mask, next_x, next_y, count)def main():tmp = list(map(int, input().split()))m, n = tmp[0], tmp[1]grid = [[0] * n for _ in range(m)]for i in range(m):tmp = list(map(int, input().split()))for j in range(n):grid[i][j] = tmp[j]   mask = 2isAllgrid = TruegridNum = {}for i in range(m):for j in range(n):if grid[i][j] == 0:isAllgrid = Falseif grid[i][j] == 1:count = [0]dfs(grid, mask, i, j, count)gridNum[mask] = count[0]mask += 1if isAllgrid:print(m*n)return result = 0dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]for i in range(m):for j in range(n):if grid[i][j] == 0:tmp = 1visitedGrid = []for add_x, add_y in dirs:next_x, next_y = i + add_x, j + add_yif next_x < 0 or next_x >= m or next_y < 0 or next_y >= n:continueif grid[next_x][next_y] not in visitedGrid and grid[next_x][next_y] != 0:tmp += gridNum[grid[next_x][next_y]]visitedGrid.append(grid[next_x][next_y])result = max(result, tmp)print(result)   main()

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

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

相关文章

k8s学习笔记——k8s升级

前一段时间&#xff0c;由于搭建k8s集群的硬件设备故障&#xff0c;老化导致k8s需要重装。使用原来的kubeadm安装方式却发现装不了了。查了一下官方文档&#xff0c;说从v1.24版本之后&#xff0c;kubelet移除了容器引擎&#xff0c;容器及镜像管理将有第三方工具来接管&#x…

Vue.js有哪些优点和缺点

Vue.js 作为一个流行的前端框架&#xff0c;具有许多优点和一些潜在的缺点。以下是 Vue.js 的一些主要优点和缺点&#xff1a; 优点&#xff1a; 轻量级和灵活性&#xff1a;Vue.js 的核心库专注于视图层&#xff0c;这使得它非常轻量级&#xff08;压缩后只有几十KB&#xff…

Web 反爬指南

本质上说&#xff0c;防抓的目的在于增加脚本或机器获取你网站内容的难度&#xff0c;而不要影响真实用户的使用或搜索引擎的收录 不幸的是这挺难的&#xff0c;你需要在防抓和降低真实用户以及搜索引擎的可访问性之间做一下权衡。 为了防爬&#xff08;也称为网页抓取、屏幕…

智谱AI: ChatGLM API的使用

一、获取API 1、打开网址&#xff1a;智谱AI开放平台 注册账号登录 2、登录&#xff0c;查看API key (注册后赠送100万token&#xff0c;实名认证后多赠送400万, 有效期一个) 二、安装及调用 安装质谱SDK pip install zhipuai调用方式 流式调用 from zhipuai import ZhipuA…

开放签电子签章,让签字有迹可循

开放签&#xff08;企业版&#xff09;V2.0.5版本上线后&#xff0c;系统支持一键查询电子文件的签署操作记录&#xff0c;支持一键生成详细的签署记录报告&#xff0c;详细请看下图&#xff1a; 1、操作记录详情&#xff1a; 从合同发起、填写、签署、撤销等环节全流程展示操…

【Linux从入门到放弃】探究进程如何退出以进程等待的前因后果

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 进…

常见反爬及应对

一&#xff0c;特殊混淆的还原 1.1 还原 AAEncode 与 JJEncode AAEncode是一种JavaScript代码混淆算法&#xff0c;利用它&#xff0c;可以将代码转换成 颜文字 表示的JavaScript代码。 去掉代码最后的 (‘‘)&#xff0c;这是函数的自调用&#xff0c;去除后就是函数的声明…

【CSharp】定义结构体并指定字段对齐

【CSharp】定义结构体并指定字段对齐 1.背景2.代码3.分析1.背景 在 C# 中可以通过 StructLayout 属性来定义结构体并指定字段对齐方式。 在 C# 中,内存对齐是指数据在内存中的排列方式,使用StructLayout 特性用于控制结构体的内存布局。其特性可以指定字段的内存排列顺序(例…

【揭秘】国内十大顶尖AI大模型,引领智能科技新纪元

大模型大模型通常指的是参数量非常大、数据量也非常大的深度学习模型。这些模型由数百万到数十亿甚至更多的参数组成&#xff0c;需要海量的数据和强大的计算资源进行训练和推理学习的模型。大模型设计的目的在于提高模型的表示能力和性能、应对复杂数据集和任务、提升泛化能力…

6、限界上下文:定义领域边界的利器

在DDD限界上下文&#xff1a;定义领域边界的利器领域建模和微服务建设过程中&#xff0c;会有很多项目参与者&#xff0c;包括领域专家、产品经理、项目经理、架构师、开发经理和测试经理等。对于同样的领域知识&#xff0c;不同的参与者可能会有不同的理解。而且有的时候同一个…

嵌入式学习——硬件(Linux系统在2440上的启动)——day57

1. Linux2.6系统在s3c2440上的启动过程分三个阶段 1.1 启动u-boot 1.2 启动Linux内核 1.3 挂载根文件系统 2. bootloader 2.1 定义 bootloader的本质是一个裸机程序&#xff0c;bootlood专门是为了能够正确地启动linux操作系 统&#xff0c;在系统初上电时需要对系统做一些…

BK145FRC10HSK、BK165FRC10HSK电液比例开环控制变量泵放大器

BK15FRC10HAK、BK35FRC10HAK、BK45FRC10HAK、BK55FRC10HAK、BK70FRC10HSK、BK80FRC10HSK、BK90FRC10HSK、BK100FRC10HSK、BK120FRC10HSK、BK145FRC10HSK、BK165FRC10HSK、BK180FRC10HSK电液比例开环控制柱塞泵主要是在传统的液压泵基础上&#xff0c;增加了电液比例控制先导阀。…

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本&#xff0c;文本数据处理的核心是做tokenization&#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理&#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…

重采样(上采样或下采样)是什么?

重采样&#xff08;Resampling&#xff09;是在数据处理中常用的一种技术&#xff0c;主要用于处理数据集中的不平衡问题。具体来说&#xff0c;重采样可以分为上采样&#xff08;Oversampling&#xff09;和下采样&#xff08;Undersampling&#xff09;&#xff0c;它们分别是…

【bug报错已解决】ERROR: Could not find a version that satisfies the requirement

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析 二、解决方法2.1 方法一2.2 方法二 三、总结 引言 有没有遇到过那种让人…

软件开发中常用环境你都知道哪些?

目录 本地环境&#xff08;Local Environment&#xff0c;简称 LOCAL&#xff09; 开发环境&#xff08;Development Environment&#xff0c;简称 DEV&#xff09; 测试环境&#xff08;Testing Environment&#xff0c;简称 TEST&#xff09; 集成测试环境&#xff08;Sy…

墨烯的C语言技术栈-C语言基础-003

三.数据类型 1.char // 字符数据型 2.short // 短整型 3.int // 整型 4.long // 长整型 5.long long // 更长的整型 6.float // 单精度浮点数 7.double // 双精度浮点数 为什么写代码? 为了解决生活中的问题 购物,点餐,看电影 为什么有这么多类型呢? 因为说的话都是字符型…

CM-UNet: Hybrid CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation

论文&#xff1a;CM-UNet: Hybrid &#xff1a;CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation 代码&#xff1a;https://github.com/XiaoBuL/CM-UNet Abstrcat: 由于大规模图像尺寸和对象变化&#xff0c;当前基于 CNN 和 Transformer 的遥感图像语义分割方…

mysql 中 单独获取已知日期的年月日其中之一

限定条件&#xff1a;2021年8月&#xff0c;写法有很多种&#xff0c;比如用year/month函数的year(date)2021 and month(date)8&#xff0c;比如用date_format函数的date_format(date, "%Y-%m")"202108"每天&#xff1a;按天分组group by date题目数量&…

java之静态属性方法

在java中有一个static的关键字&#xff0c;它用来修饰类的成员。如果用static修饰属性&#xff0c;该属性被称为静态属性 静态属性的访问格式如下 类名.属性名 如果没有修饰静态属性示例代码如下 class Xuesheng1{String name;int age;String school"A大学";publ…