【代码随想录算法训练营第五十八天|卡码网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.xdnf.cn/news/1475375.html

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

相关文章

ASP.NET MVC-razor编写-2-svg中使用js+添加事件监听

环境&#xff1a;win10 效果 初始状态&#xff1a; 鼠标移入某个text&#xff08;比如KS primer&#xff09;时&#xff0c;text和连接的线条与箭头都变色&#xff1a; 鼠标移出时回复正常。 如果是移入另一种红色的text&#xff08;比如Cell Sceening Tag&#xff09;&…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性,这些属性固定,形成了机器人的个人偏好 在实现过程中,此处使用一个xml配置文件,配置了机器人的个人年龄、性别、职业等内容,同时包含常见有关于…

可信验证解释

学习目标&#xff1a;可信验证解释 可信验证是一种基于计算机技术和安全机制&#xff0c;用于确保系统、程序或数据的完整性和可信性的方法。以下是关于可信验证的详细解释&#xff1a;一、定义与原理 可信验证指的是利用计算机技术和安全机制&#xff0c;对系统、程序或数据…

一.2 程序被其他程序翻译成不同的格式(编译)

hello程序的生命周期是从一个高级C语言程序开始的&#xff0c;因为这种形式能够被人读懂。然而&#xff0c;为了在系统上运行hello.c程序&#xff0c;每条C语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序&#xff08;也称为可执…

【分布式系统】注册中心Zookeeper

目录 一.Zookkeeper 概述 1.Zookkeeper 定义 2.Zookkeeper 工作机制 3.Zookkeeper 特点 4.Zookkeeper 数据结构 5.Zookkeeper 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 6.Zookkeeper 选举机制 第一次启动选举机制 非第一次…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…

揭秘:源代码防泄密的终极秘籍

在当今信息科技高度发达的时代&#xff0c;源代码作为企业最核心的资产之一&#xff0c;其安全性不言而喻。源代码的泄露可能导致企业技术机密被竞争对手获取&#xff0c;进而威胁到企业的市场竞争力和长远发展。因此&#xff0c;源代码防泄密成为了企业信息安全工作的重中之重…

解决win10报“无法加载文件……profile.ps1,因为在此系统上禁止运行脚本”的问题

打开命令行报错 解决方法 使用管理员权限打开PowerShell&#xff1a;WinX, 选择“Windows PowerShell&#xff08;管理员&#xff09;” 输入&#xff1a;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 输入&#xff1a;y确认修改安全策略 &#xff1a;y确认修改安全策略…

vue + element ui 实现侧边栏导航栏折叠收起

首页布局如下 要求点击按钮,将侧边栏收缩, 通过 row 和 col 组件&#xff0c;并通过 col 组件的 span 属性我们就可以自由地组合布局。 折叠前 折叠后 <template><div class"app-layout" :class"{ collapse: app.isFold }"><div class&…

Java-Sql注入以及如何解决

sql脚本注入: 如果sql语句使用字符串拼接&#xff0c;可能会出现字符串的拼接&#xff0c;导致sql注入。 #是会先进行预编译&#xff0c;传进来的参数通过占位符填入到已经完成编译的语句中去。

树莓派4B_OpenCv学习笔记21:OpenCV_haar人脸识别

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1&#xff1a; ​ Python 版本3.7.3&#xff1a; 今日学习&#xff…

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码&#xff1a; 优点&#xff1a;代码灵活方便缺点&#xff1a;学习成本高 工具&#xff1a; 优点&#xff1a;易上手缺点&#xff1a;灵活度低&#xff0c;有局限性。 总结&#xff1a; 功能脚本&#xff1a;工…

【Ubuntu】详细说说Parallels DeskTop安装和使用Ubuntu系统

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、Ubuntu系统的使用2.1 系统的下载2.2 系统的安装2.3 安装桌面版(可选)2.3.1 安装/更新apt2.3.2 安装桌面版2.3…

【Go】函数的使用

目录 函数返回多个值 init函数和import init函数 main函数 函数的参数 值传递 引用传递&#xff08;指针&#xff09; 函数返回多个值 用法如下&#xff1a; package mainimport ("fmt""strconv" )// 返回多个返回值&#xff0c;无参数名 func Mu…

华贝甄选绿色积分模式的可信赖之处揭秘

华贝甄选是天贝集团旗下的数字产融生态领先品牌&#xff0c;业务涵盖 PPP 产业、金融生态、国际投资、智慧能源、数字产业、智慧产业、三农产业、生物科技等领域。其优势在于通过多维系统助力 DAO 组织系统打造&#xff0c;实现财富与健康双丰收&#xff1b;打造全新生态体系&a…

FreeRTOS和UCOS操作系统使用笔记

FreeRTOS使用示例 任务创建与删除 #define START_TASK_PRIO 1 //任务优先级 (1) #define START_STK_SIZE 128 //任务堆栈大小 (2) TaskHandle_t StartTask_Handler; //任务句柄 (3) void start_task(void *pvParameters);//任务函数 (4)#define TASK1_…

vue3 学习 之 vue3使用

为什么要学习vue3呢&#xff1f; vue2.0也是现在比较稳定的一个版本&#xff0c;社区还有周边都比较完善&#xff0c;如果不是非必要其实我们不需要着急直接升级到vue3.0; 那为什么还要学习&#xff0c;主要是还是为了了解一下vue3.0相较于2.0的优势和特性&#xff0c;方便之后…

跳转控制语句—break和continue

break语句我本人只在switch语句和循环语句中遇见&#xff0c;continue则只在循环语句中遇见&#xff1b; 下面我来记录一下&#xff0c;它俩的不同之处&#xff1a; 1.break 相比之下&#xff0c;break是比较简单的&#xff0c;就是跳出循环体&#xff0c;执行循环体下方的代…

刷题之删除有序数组中的重复项(leetcode)

删除有序数组中的重复项 这题简单题&#xff0c;双指针&#xff0c;一个指针记录未重复的数的个数&#xff0c;另一个记录遍历的位置。 以下是简单模拟&#xff0c;可以优化&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int l0…