[华为OD] 污染水域(多源BFS)

救命,因为实在找不到工作。。。
所以已经开始准备华为OD的笔试题了。。。
但是内心深处不是很想去OD呜呜呜


文章目录

  • BFS与多源BFS
  • 污染水域
  • leetcode 1162::地图分析
  • leetcode 542:01矩阵
  • leetcode 1020:飞地的数量

BFS与多源BFS

BFS广度优先搜索,BFS一般用队列实现,遵循着先进先出的原则,比较典型的例子就是之前说过的二叉树层序遍历。

在二叉树的层序遍历中,入口只有一个,也就是根节点。在遍历过程中,每次都拿出队列的第一个值,并把它的衍生值放在队列的最右边。

在二叉树的层序遍历中,从上往下一层一层走下去,不会出现一个节点重复出现的情况。

多源BFS,就像它的名称一样,有多个源头(也就是入口)。一般用在图中,以多个入口为起点,向周围进行遍历,因为从多个入口出发可能走到同一个位置,为了防止重复遍历,需要对遍历过的位置进行标记。

下面给出了《污染水域》的题解和一些相似的leetcode题目的代码。

污染水域

输入一行字符串,字符串可以转换为N*N的数组,数组可认为是一个水域,判断多少天后,水域被全部污染。
数组中只有1和0两个数,1表示污染,每天只可污染上下左右的水域,如果开始全部被污染或永远无法污染,则返回-1。

输入1,0,1,0,0,0,1,0,1
输出2
说明输入转化为数组是
1,0,1
0,0,0
1,0,1
第一天后水域变为
1,1,1
1,0,1
1,1,1
第二天全部为被污染

这个题就是一个很典型的多源BFS问题,首先要找到遍历的入口,也就是初始水域中为1的位置。将这些位置都加入队列。
如果水域中不存在1,或者水域中全是1,那么不需要再进行污染,直接返回-1。
我们从每个入口出现,向上下左右四个方向进行遍历,并标记。如果要遍历的位置已经被标记了,或者超过了水域的边界,那么就忽略。如果没有被标记,则把它加入队列中去。

我们一步一步地完成这个代码。

  1. 获取输入,构造水域矩阵。
    在华为OD的题目中,输入需要自己获取,所以我们可以先构造一下输入的矩阵。

    link = list(map(int,input().split()))
    n = int(math.sqrt(len(link)))
    mat = [[0]*n for _ in range(n)]
    
  2. 现在我们来找多源BFS中的源, 并把它存到一个队列中去。

    q = []
    for i in range(n):for j in range(n):mat[i][j] = link[i*n+j]if link[i*n+j]==1:  # 如果是污染区q.append([i,j])
    
  3. 如果区域不存在污染或者全是污染,直接返回 - 1。

    if not q or len(q) == len(link):return -1
    
  4. 定义一下遍历的方向,和最大天数。

    direction = [[1,0],[-1,0],[0,1],[0,-1]] # 四个方向
    max_num = 0    # 求最大天数,所以初始化为一个比较小的数
    
  5. 开始遍历!

    while q: # 只要q中有东西就一直遍历cur  = q.pop(0) # 取出队列的第一个值x, y = cur # 当前位置for di in directions:  # 遍历四个方向newx = x+di[0]newy = y+di[1]if newx<0 or newy<0 or newx>=n or newy>=n:continue # 如果越界就跳过if mat[newx][newy]!=0:continue # 如果访问过就跳过mat[newx][newy] = mat[x][y]+1 # 标记当前位置,用的数字可以代表与污染区的距离【也就是扩散用的时间】if max_num < mat[newx][newy]:max_num = mat[newx][newy] # 更新最大天数q.append([newx,newy])
    return max_num-1 # 因为mat[x][y]的初始值是1,所以这里要-1
    

leetcode 1162::地图分析

https://leetcode.cn/problems/as-far-from-land-as-possible/

这道题也是一个典型的多源BFS。要求的是海洋单元到距离它最近的陆地单元格的距离是最大的,可以理解成我们已陆地单元格为源头,开始向四周遍历,最后访问到的海洋就是距离最远的海洋。

我们用海洋到陆地的距离来标记单元格,那么最后找到的海洋的标记,就代表了它到离它最近的陆地单元格的距离。

class Solution(object):def maxDistance(self, grid):""":type grid: List[List[int]]:rtype: int"""direction = [[-1,0],[1,0],[0,1],[0,-1]]q = []n = len(grid)for i in range(n):for j in range(n):if grid[i][j] == 1:q.append([i,j])if not q or len(q)==n**2:return -1while q:cur = q.pop(0)x,y = curfor di in direction:tmp_x = x + di[0]tmp_y = y + di[1]if tmp_x<0 or tmp_y<0 or tmp_x>=n or tmp_y>=n or grid[tmp_x][tmp_y]!=0:continuegrid[tmp_x][tmp_y] = grid[x][y]+1q.append([tmp_x,tmp_y])return grid[cur[0]][cur[1]]-1

leetcode 542:01矩阵

https://leetcode.cn/problems/01-matrix/

求每一个非0元素到最近的0的距离。可以理解成以0为起点,向周围扩散,并用起到到当前位置的距离进行标记。要返回的是距离矩阵,其实就是被标记后的矩阵。

class Solution(object):def updateMatrix(self, matrix):""":type mat: List[List[int]]:rtype: List[List[int]]"""q = []m = len(matrix)n = len(matrix[0])for i in range(m):for j in range(n):if matrix[i][j]==0:q.append([i,j])else:matrix[i][j] = -1direction = [[1,0],[-1,0],[0,1],[0,-1]]while q:cur = q.pop(0)x,y = curfor di in direction:newx = x+di[0]newy = y+di[1]if newx<0 or newy<0 or newx>=m or newy>=n or matrix[newx][newy]!=-1:continuematrix[newx][newy] = matrix[x][y]+1q.append([newx,newy])return matrix

leetcode 1020:飞地的数量

https://leetcode.cn/problems/number-of-enclaves/

找到无法离开网格边界的陆地单元格的数量,就是找没有和边界相连的陆地单元格的数量。我们可以换个思路,找到所有与边界相连的陆地单元格,并把它们置0,那么剩下的陆地单元格就是不相连的。

我们的源就是边界上的陆地单元格,以此为入口向四个方向遍历。

class Solution(object):def numEnclaves(self, grid):""":type grid: List[List[int]]:rtype: int"""m = len(grid)n = len(grid[0])if m<=2 or n<=2:return 0q = []for i in range(m):if grid[i][0]==1:q.append([i,0])if grid[i][n-1]==1:q.append([i,n-1])for j in range(1,n-1):if grid[0][j] == 1:q.append([0,j])if grid[m-1][j] ==1:q.append([m-1,j])direction = [[-1,0],[1,0],[0,1],[0,-1]]while q:cur = q.pop(0)x,y = curgrid[x][y] = 0for di in direction:newx = x+di[0]newy = y+di[1]if newx<0 or newy<0 or newx>=m or newy>=n or grid[newx][newy]==0:continuegrid[newx][newy] = 0q.append([newx,newy])return sum([sum(grid[i]) for i in range(m)])

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

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

相关文章

AJAX:宏任务与微任务

异步任务划分为了 宏任务&#xff1a;由浏览器环境执行的异步代码 微任务&#xff1a;由 JS 引擎环境执行的异步代码 宏任务和微任务具体划分&#xff1a; 左边表格是宏任务&#xff0c;右边是微任务 事件循环模型 /*** 目标&#xff1a;阅读并回答打印的执行顺序 */ console…

Spark编程-键值对RDD(K,V)创建及常用操作

简述 SparkRDD中可以包含任何类型的对象&#xff0c;在实际应用中&#xff0c;“键值对”是一种比较常见的RDD元素类型&#xff0c;分组和聚合操作中经常会用到&#xff0c;尤其是groupByKey和reduceByKey。 Spark操作中经常会用到“键值对RDD”&#xff08;Pair RDD&a…

CSS样式

1.高度和宽度 .c1{height:300px;width:500px;}注意事项&#xff1a; 宽度支持百分比&#xff0c;高度不支持。行内标签&#xff1a;默认无效会计标签&#xff1a;默认有效&#xff08;霸道&#xff0c;右侧区域空白&#xff0c;也不给你用&#xff09; 2.块级和行内标签 块…

【Django学习】(十四)自定义action_router

之前我们的视图类可以继承GenericViewSet或者ModelViewSet&#xff0c;我们不用再自定义通用的action方法&#xff0c;但是有时候我们需要自定义action&#xff0c;我们该如何设计呢&#xff1f; 自定义action 1、手写视图逻辑 1.1、先在视图集里自定义action方法&#xff0…

HCIP第十二天(笔记)

企业网的三层架构 园区 --- 工厂、政府机关、商城、校园、公园等公共场所&#xff0c;为了实现数据的互通&#xff0c;所搭建的网络都可以称为是园区网 接入层 使用二层交换机 --- 依靠MAC地址表进行转发的设备 WLAN --- 无线局域网 --- 广义上指以无线电波、激光…

GO语言泛型

set一般没什么不方便的 但是使用GET 需要使用类型断言,将取出来的数据转为预期数据, 空接口本身是一个装箱,会产生内存逃逸和多一部分空间. 于是1.17GO使用泛型. 泛型实现: 分析可执行文件后:发现 也就是泛型会为每个数据类型都生产一套代码,导致可执行文件大小增加,并且使用…

uni-app中a标签下载文件跳转后左上角默认返回键无法继续返回

1.首先使用的是onBackPress //跟onShow同级别 onBackPress(option){ uni.switchTab({ url:/pages/....... return true }) }发现其在uni默认头部中使用是可以的 但是h5使用了"navigationStyle":"custom"后手机默认的返回并不可以&#xff0c; 2.经过查询…

LCD-STM32液晶显示中英文-(5.字符编码)

目录 字符编码 字符编码说明参考网站 字符编码 ASCII编码 ASCII编码介绍 ASCII编码表 中文编码 1. GB2312标准 区位码 2. GBK编码 3. GB18030 各个标准的对比说明 4. Big5编码 字符编码 字符编码说明参考网站 字符编码及转换测试&#xff1a;导航菜单 - 千千秀字 …

智迪科技在创业板上市:市值约31亿元,谢伟明和黎柏松为实控人

7月17日&#xff0c;珠海市智迪科技股份有限公司&#xff08;下称“智迪科技”&#xff0c;SZ:301503&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;智迪科技的发行价为31.59元/股&#xff0c;发行数量为2000万股&#xff0c;募资总额约为6.32亿元&#xff0c;…

onnx如何改变输入的维度

最近遇到一个难题&#xff0c;就算在用行为识别onnx转rknn的时候提示维度不对&#xff0c;因为行为识别模型是5维的。而rknn只支持4维。 我们先加载模型看一下它的input和node 可以看出模型的input[1]是一个全连接&#xff0c;因此我们可以直接修改他的input[0] input hel…

Kafka 入门到起飞系列 - 生产者发送消息流程解析

生产者通过producerRecord 对象封装消息主题、消息的value&#xff08;内容&#xff09;、timestamp(时间戳)等 生产者通过send()方法发送消息&#xff0c;send()方法会经过如下几步 1. 首先将消息交给拦截器&#xff08;Interceptor&#xff09;处理, 拦截器对生产者而言&…

静态数码管——FPGA

文章目录 前言一、数码管1、数码管简介2、共阴极数码管or共阳极数码管3、共阴极与共阳极的真值表 二、系统设计1、模块框图2、RTL视图 三、源码1、seg_led_static模块2、time_count模块3、top_seg_led_static(顶层文件) 四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、…

数字化时代,智能文件工具让办公升级

无论是在办公室还是在学校&#xff0c;文件管理是我们日常工作中不可或缺的一环。传统的文件整理方式可能需要花费大量的时间和精力&#xff0c;而且常常容易出现混乱和遗漏。然而&#xff0c;随着科技的不断进步&#xff0c;我们现在有幸生活在一个数字化时代&#xff0c;因此…

Netty粘包与拆包

文章首发地址 TCP是一个“流”协议。所谓流&#xff0c;就是没有界限的一长串二进制数据。拆包和粘包&#xff1a;TCP作为传输层协议&#xff0c;并不了解上层业务数据的具体含义&#xff0c;它会根据TCP缓冲区的实际情况进行数据包的划分&#xff0c;所以在业务上认为是一个完…

如何正确有效的学习java前端(合集)

大量阅读 我是一个劲头十足的读者。所以&#xff0c;我的第一个关于学习JavaScript的技巧就是关于阅读&#xff0c;这绝不是巧合。书籍和其他的资源(如文章)可以在很大程度上帮助你学习JavaScript。通过实践学习&#xff0c;书籍是我学习新学科最喜欢的方式。在学习JavaScript的…

测试用例(2)

项目管理工具 主要用tapd&#xff0c;jira少用 acp 敏捷项目管理证书 task:故事&#xff0c;一个故事有开始也有结束&#xff0c;那么在项目管理里面&#xff0c;会把每个任务按照一个task来看&#xff0c;那么这个task也可以叫story&#xff0c;具体指的就是任务有开始有结…

ChatGPT火热之下的冷思考

作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序&#xff0c;ChatGPT通过大量来自互联网的文本进行训练&#xff0c;并使用深度学习和机器学习算法来理解用户的问题并提供准确的回答。并且&#xff0c;ChatGPT还内置了情感分析、关键字提取和实体识别等功能&am…

Beyond Compare 代码比较工具

一、下载 官网下载地址&#xff1a; https://www.scootersoftware.com/download.php 选择 Windows 系统&#xff0c;简体中文版本&#xff0c;点击下载。 下载完成 二、安装 步骤1&#xff1a;双击安装包 步骤2&#xff1a;进入安装向导&#xff0c;点击下一步 步骤3&a…

Linux的scp命令使用详解

scp 是 Linux 中用来复制文件的命令。它是基于 SSH 协议的&#xff0c;可以在本地主机和远程主机之间复制文件。命令的语法是&#xff1a;scp [options] [source_file] [destination]。 常用的[options]选项包括-r&#xff08;递归复制目录&#xff09;和-P&#xff08;指定连…

Ubuntu 20 开机免密root登录

首先如果没有设置root密码&#xff0c;先设置一下root用户的密码&#xff1a;sudo passwd root 一条命令打开所有需要修改的文档&#xff1a; sub /root/.profile /etc/pam.d/gdm-autologin /etc/pam.d/gdm-password /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf /etc/…