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

文章目录

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

101.孤岛的总面积

可以把最外围的都检查一遍是否有为1的,有的话就把他接壤的全变成海,然后正常算面积。也可以看岛屿是否有靠边的位置,有的话该岛面积不计算在总面积中。

direction = [[1, 0], [0, 1], [-1, 0], [0, -1]]
def bfs(cur, islands, visited):N = len(islands)M = len(islands[0])st = [cur]area = 1flag = Falseif cur[0]==0 or cur[0]==N-1 or cur[1]==0 or cur[1]==M-1:flag = Truewhile st:cur = st.pop()for d in direction:x = d[0] + cur[0]y = d[1] + cur[1]if x < 0 or x >= N or y < 0 or y >= M:continueif islands[x][y] == 1 and visited[x][y] == False:if x==0 or x==N-1 or y==0 or y==M-1:flag = Truearea += 1st.append([x, y])visited[x][y] = Trueif flag:return 0else:return area
if __name__ == '__main__':area = 0NM = input().split()N, M = int(NM[0]), int(NM[1])islands = [[0] * M for _ in range(N)]for i in range(N):lands = input().split()for j in range(M):islands[i][j] = int(lands[j])visited = [[False] * M for _ in range(N)]for i in range(N):for j in range(M):if (islands[i][j] == 1) and (visited[i][j]==False):visited[i][j] = Truetmp = bfs([i,j], islands, visited)# print([i, j], tmp)area += tmpprint(area)

102.沉没孤岛

这题就是从外圈找,找到未访问且为1的就把接壤的在新的岛屿图上标注为1。

direction = [[1, 0], [0, 1], [-1, 0], [0, -1]]def bfs(cur, islands, visited, new_islands):N = len(islands)M = len(islands[0])st = [cur]while st:cur = st.pop()for d in direction:x = d[0] + cur[0]y = d[1] + cur[1]if x < 0 or x >= N or y < 0 or y >= M:continueif islands[x][y] == 1 and visited[x][y] == False:st.append([x, y])visited[x][y] = Truenew_islands[x][y] = 1
if __name__ == '__main__':area = 0NM = input().split()N, M = int(NM[0]), int(NM[1])islands = [[0] * M for _ in range(N)]for i in range(N):lands = input().split()for j in range(M):islands[i][j] = int(lands[j])visited = [[False] * M for _ in range(N)]new_islands = [[0] * M for _ in range(N)]for j in range(M):if islands[0][j] == 1 and not visited[0][j]:new_islands[0][j] = 1bfs([0, j], islands, visited, new_islands)if islands[N-1][j] == 1 and not visited[N-1][j]:new_islands[N-1][j] = 1bfs([N-1, j], islands, visited, new_islands)for i in range(1, N-1):if islands[i][0] == 1 and not visited[i][0]:new_islands[i][0] = 1bfs([i, 0], islands, visited, new_islands)if islands[i][M-1] == 1 and not visited[i][M-1]:new_islands[i][M-1] = 1bfs([i, M-1], islands, visited, new_islands)for island in new_islands:print(' '.join(map(str, island)))

103.水流问题

正向逻辑

正向逻辑就是对每一块去看他能流到哪里,如果同时能流到第一边界和第二边界那就输出。但是会超时。

def dfs(cur, grid, visited):if visited[cur[0]][cur[1]]:returnvisited[cur[0]][cur[1]] = TrueN = len(grid)M = len(grid[0])directions = [[1,0], [-1,0],[0,1], [0,-1]]for d in directions:x = cur[0] + d[0]y = cur[1] + d[1]if x < 0 or x >= N or y < 0 or y >= M:continueif grid[x][y] <= grid[cur[0]][cur[1]]:dfs([x, y], grid, visited)def flow2Borad(cur, grid):N = len(grid)M = len(grid[0])visited = [[False] * M for _ in range(N)]dfs(cur, grid, visited)isFirst = FalseisSec = Falsefor i in range(M):if visited[0][i]:isFirst = Truebreakif not isFirst:for i in range(N):if visited[i][0]:isFirst = Truebreakfor i in range(M):if visited[N-1][i]:isSec = Truebreakif not isSec:for i in range(N):if visited[i][M-1]:isSec = Truebreak   if isSec and isFirst:return Trueelse:return False 
if __name__ == '__main__':area = 0NM = input().split()N, M = int(NM[0]), int(NM[1])islands = [[0] * M for _ in range(N)]for i in range(N):lands = input().split()for j in range(M):islands[i][j] = int(lands[j])for i in range(N):for j in range(M):if flow2Borad([i,j], islands):print(str(i), ' ',str(j))

反向逻辑

对第一边界和第二边界的格子往回推导,退出哪些格子能够流到第一边界和第二边界,如果一个格子能流到第一边界,并且可以流到第二边界那就输出他。

def dfs(cur, islands, visited):if visited[cur[0]][cur[1]]:returnN = len(islands)M = len(islands[0])visited[cur[0]][cur[1]] = Truedirections = [[1,0], [-1,0], [0,1], [0,-1]]for d in directions:x = cur[0] + d[0]y = cur[1] + d[1]if x < 0 or x >= N or y < 0 or y >= M:continueif islands[x][y] < islands[cur[0]][cur[1]]:continuedfs([x,y], islands, visited)if __name__ == '__main__':N, M = map(int, input().split())islands = [[0] * M for _ in range(N)]for i in range(N):lands = input().split()for j in range(M):islands[i][j] = int(lands[j])isFirst_Borad = [[False] * M for _ in range(N)]isSec_Board = [[False] * M for _ in range(N)]for i in range(N):dfs([i, 0], islands, isFirst_Borad)dfs([i, M-1], islands, isSec_Board)for j in range(M):dfs([0, j], islands, isFirst_Borad)dfs([N-1, j], islands, isSec_Board)for i in range(N):for j in range(M):if isSec_Board[i][j] and isFirst_Borad[i][j]:print(str(i)+' '+str(j))

104.建造最大岛屿

有点麻烦的这题,在前面的基础上还要再做一个列表来对岛屿进行标号。在计算完所有岛屿面积后做出一个岛屿标号和面积的字典,然后遍历所有的位置,如果是海洋,则在他四周找岛屿,没找到一个不同标号的岛屿就加到结果中,最后选最大的一个岛屿面积和。(但是题目说没有岛输出0,但是答案又是1,就是默认没有岛屿就翻转一块位置变成岛屿

direction = [[1, 0], [0, 1], [-1, 0], [0, -1]]def bfs(cur, islands, visited, mark, num):visited[cur[0]][cur[1]] = Truemark[cur[0]][cur[1]] = numst = [cur]area = 1while st:cur = st.pop()for d in direction:x = d[0] + cur[0]y = d[1] + cur[1]if x < 0 or x >= N or y < 0 or y >= M:continueif islands[x][y] == 1 and visited[x][y] == False:st.append([x, y])area += 1visited[x][y] = Truemark[x][y] = numreturn areaif __name__ == '__main__':N, M = map(int, input().split())islands = [[0] * M for _ in range(N)]for i in range(N):lands = input().split()for j in range(M):islands[i][j] = int(lands[j])visited = [[False] * M for _ in range(N)]mark = [[0] * M for _ in range(N)]num = 1islandArea = {}for i in range(N):for j in range(M):if (islands[i][j] == 1) and (visited[i][j]==False):area = bfs([i,j], islands, visited, mark, num)islandArea[num] = areanum += 1directions = [[1,0], [-1,0], [0,1], [0,-1]]if islandArea:result = max([value for value in islandArea.values()])for i in range(N):for j in range(M):if islands[i][j] == 0:temp = 1pre = []for d in directions:nextx = i + d[0]nexty = j + d[1]if nextx < 0 or nextx >= N or nexty < 0 or nexty >= M:continue                    if islands[nextx][nexty] == 1 and not mark[nextx][nexty] in pre:temp += islandArea[mark[nextx][nexty]]pre.append(mark[nextx][nexty])result = max(result, temp)print(result)else:print(1)

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

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

相关文章

后端部署Jar包 | 启动失败系列问题(图解-BuiId,Maven)

目录 项目的构建 打包前的准备 合理配置pox.xml文件 Build 打包方式 Maven打包方式 Jar包部署 测试后端接口 项目的构建 我的项目是SpringBoot2脚手架 先准备一个相对于的数据库依赖 数据库的任意库 Yaml配置后 才能正常在IDEA中跑起来 打包前的准备 合理配置pox.xm…

rs轨迹校验

最近发现有些网站的rs似乎上了轨迹校验&#xff0c;附图&#xff1a; 写了个解rscookie的插件&#xff0c;可以精准看到rs更改了那些校验点&#xff0c;需要做什么处理&#xff0c;就很舒服 有需要轨迹代码或者瑞数相关的可以联系 let v huaqu0727

Cmake qt_add_library

目录 基本用法 参数说明 示例 创建一个新的Qt项目 创建CMakeLists.txt ​​​​​创建库的源文件 创建主程序文件 构建项目 在Qt中&#xff0c;qt_add_library 是一个用于在CMake构建系统中添加库的命令。这个命令通常用于创建一个新的Qt库&#xff0c;并将其添加到CMa…

李彦宏:大模型公司要注重AI实际应用,写高考作文价值有限

李彦宏在2024世界人工智能大会上表示&#xff0c;大模型公司不应只关注写高考作文&#xff0c;而应更多地投入到实际应用中。这话说得有道理&#xff0c;不过我们也不能忽视探索性尝试的价值。接下来&#xff0c;我们来具体谈谈这个问题。 大模型在实际应用中的重要性 李彦宏…

性能测试:JMeter与Gatling的高级配置

性能测试是软件开发过程中不可或缺的一部分&#xff0c;它帮助我们确保应用在高负载下仍能保持良好的响应时间和稳定性。本文将深入探讨两种流行的性能测试工具&#xff1a;Apache JMeter和Gatling&#xff0c;并提供详细的高级配置指南以及Java代码示例。 Apache JMeter 高级…

uniapp小程序IOS端,uni.createInnerAudioContext()无声音

可能的问题 路径中有中文字符需要使用uni.getBackgroundAudioManager()播放其他问题 解决办法 首先我的路径中没有中文字符&#xff0c;如果有的&#xff0c;可能需要转义一下或者干脆不使用中文字符&#xff0c;第二个也是从其他博客中看到的&#xff0c;我这边分享一下我的…

【Qt】QTableView通过setColumnWidth设置了列宽无效

1. 解决 将模型设置给表格视图之后&#xff0c;再设置tableveiw的列宽。 2. 参考 https://blog.csdn.net/ml29895063/article/details/132716687

Feign远程调用,请求头丢失情况

现象 解决方案 import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolde…

编译开源车载Linux操作系统AGL

随着汽车行业的智能化和互联化趋势日益明显&#xff0c;车载系统作为汽车的重要组成部分&#xff0c;其性能和功能也受到了越来越多的关注。Linux作为一款开源的操作系统&#xff0c;具有稳定性高、安全性强、可定制性好等优点&#xff0c;因此成为了车载系统领域的热门选择。 …

我应该怎么办?(关于专升本篇!)

kimi&#xff0c;我需要你的帮助&#xff0c;我现在在湖北工业职业技术学院&#xff0c;我2025年将要开始进行专升本&#xff0c;预计在明年4月26日进行专升本&#xff0c;但是我现在很迷茫&#xff0c;自己感觉自己很懒惰&#xff0c;自己每天都过得很迷糊&#xff01; 面对专…

“unk0“ is not an ethernet device

nmap报错 Starting Nmap 7.94 ( https://nmap.org ) at 2024-07-05 14:47 中国标准时间 Only ethernet devices can be used for raw scans on Windows, and "unk0" is not an ethernet device. Use the --unprivileged option for this scan. QUITTING! 查看网卡…

SSM+汽车停车位共享APP-计算机毕业设计源码041534

摘 要 随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户停车难问题,本文设计并实现了APP停车位共享系统.该系统通过错峰停车达到车位利用率最大化.基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬件设计和系统实现三方面进行详细…

ffmpeg + opencv 把摄像头画面保存为mp4文件(Ubuntu24.04)

参考链接 ffmpeg opencv 把摄像头画面保存为mp4文件_ffmpeg转化摄像头mp4-CSDN博客 调试环境 Ubuntu24.04 ffmpeg 6.1.1 opencv 4.6 g 13.2.0 C源码 #include <iostream> #include <sys/time.h> #include <string>#ifdef __cplusplus extern "…

磁力天堂磁力链接搜索大全教程,如何使用磁力天堂。

磁力链接是一种特殊的下载链接&#xff0c;磁力链接可以理解为一个文件识别码&#xff0c;而并非具体的资源地址&#xff0c;下载软件需要拿着这个识别码去整个互联网(DHT网络)去寻找持有该资源的用户(节点)&#xff0c;如果找到则可以进行传输下载。一般年代越久远的磁力链接下…

MUNIK解读ISO26262--什么是系统安全分析

功能安全之系统阶段-系统安全分析 安全分析在ISO26262标准中横跨了多个阶段例如&#xff1a;概念阶段、系统架构阶段、硬件详设阶段和软件详设阶段&#xff0c;其中part5中的安全分析工具FMEDA是标准中唯一一个和ASIL等级挂钩的&#xff0c;在Part5中也用了很大篇幅在介绍该安…

Android系统开启Docker支持

Android系统开启Docker支持 1. 基础问题 1.1 为什么Android上不能直接使用Docker? 原因是docker依赖的Linux的内核特性&#xff0c;例如&#xff1a;cgroup、namespace等&#xff0c;在Android内核中默认没有开启。 1.2 如何在Android上开启docker支持&#xff1f; 需要修…

为什么英智智能宝能让律师工作事半功倍

大语言模型能够极大提高人们的知识理解能力和知识服务能力&#xff0c;法律服务是典型的知识服务领域&#xff0c;据悉律师有38%的任务都是重复性工作&#xff0c;这些任务有潜力被大模型替代。 但在法律行业中的高度专业且复杂的问题时&#xff0c;通用型大模型的回答虽能提供…

CentOS 离线安装部署 MySQL 8详细教程

1、简介 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它基于SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;进行操作。MySQL最初由瑞典的MySQL AB公司开发&#xff0c;后来被Sun Microsystems公司…

Go 语言 Map(集合)

Go 语言 Map(集合) Map 是 Go 语言中一种非常重要的数据结构,它用于存储键值对。在 Go 中,Map 是一种无序的键值对的集合,其中每个键都是唯一的,而值则可以是任何类型。Map 是 Go 语言的内置类型,使用起来非常方便,同时也是许多 Go 程序中不可或缺的一部分。 Map 的声明…

电子元器件基础知识总结

1.0 电阻 电阻的定义&#xff1a;导体对电流的阻碍作用称之为电阻【每一种导体都有内阻的存在】 闭合的电路中电子的移动输出有多快&#xff1f;电子在导体中的移动速度是很慢的 【铜线中电流的移动速度】 电子受到原子核的束缚&#xff0c;移动的速度很慢&#xff0c;在电压足…