BFS-蓝桥杯常用Python算法

BFS

BFS算法主要有洪水填充(flood fill)和最短路径两个应用。

一、洪水填充算法(Flood Fill)

例题 1:岛屿个数(第14届省赛真题)

题目描述:

小蓝得到了一副大小为 M × N 的格子地图,可以将其视作一个只包含字符‘0’(代表海水)和 ‘1’(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上相邻的 ‘1’ 相连接而形成。
在岛屿 A 所占据的格子中,如果可以从中选出 k 个不同的格子,使得他们的坐标能够组成一个这样的排列: ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x k − 1 , y k − 1 ) ,其中 ( x ( i + 1 ) % k , y ( i + 1 ) % k ) 是由 ( x i , y i ) (x_0, y_0),(x_1, y_1), . . . ,(x_{k−1}, y_{k−1}),其中(x_{(i+1)\%k} , y_{(i+1)\%k}) 是由 (x_i , y_i) (x0,y0),(x1,y1),...,(xk1,yk1),其中(x(i+1)%k,y(i+1)%k)是由(xi,yi) 通过上/下/左/右移动一次得来的 (0 ≤ i ≤ k − 1),
此时这 k 个格子就构成了一个 “环”。如果另一个岛屿 B 所占据的格子全部位于这个 “环” 内部,此时我们将岛屿 B 视作是岛屿 A 的子岛屿。若 B 是 A 的子岛屿,C 又是 B 的子岛屿,那 C 也是 A 的子岛屿。
请问这个地图上共有多少个岛屿?在进行统计时不需要统计子岛屿的数目。

解题思路:
由于不需要考虑子岛屿的个数,我们只需要从海水开始直接使用BFS遍历,如果遇到海水就将其标记为已遍历,然后遍历其上下左右的邻接节点;如果遇到未遍历过的岛屿,就将岛屿个数加一,然后单独使用一次BFS遍历整个岛屿,在这一层BFS遍历中,只遍历未被检索的岛屿节点并将其标记为已遍历,由于整个外圈岛屿都已经被标记,所以就不会出现一个岛屿被当成多个岛屿的情况。
为了简化边缘的处理,可以直接在原地图外围增加一圈海水。这样就可以确保不会出现初始节点选在某一个岛屿内部的情况。

next_p = [(0,1),(1,0),(0,-1),(-1,0)]
next_q = [(1,0),(0,1),(-1,0),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)]
def search_island(x,y):global sea_mapglobal visited# BFS  q = []q.append((x,y))while q:x1,y1 = q[0][0], q[0][1]q.pop(0)if visited[x1][y1]:continue# only search the islandvisited[x1][y1] = 1for d in next_p:if sea_map[x1+d[0]][y1+d[1]] == '1' and visited[x1+d[0]][y1+d[1]] == False:q.append((x1+d[0], y1+d[1]))t = int(input())
sea_map = []
visited = []
for i in range(t):# initializesea_map = []visited = []m,n = map(int, input().split())sea_map.append('0'*(n+2))for j in range(m):sea_map.append('0' + input() + '0')sea_map.append('0'*(n+2))visited = [[0]*(n+2) for k in range(m+2)]# bfsans = 0q = []q.append((0,0))while q:x, y = q[0][0], q[0][1]q.pop(0)if visited[x][y]:continue# begin to visit this nodeif sea_map[x][y] == '0':# seavisited[x][y] = 1# push the nodes that near it into the queuefor d in next_q:if  0 <= x+d[0] <= m+1 and 0 <= y+d[1] <= n+1 and visited[x+d[0]][y+d[1]] == False:q.append((x+d[0], y+d[1]))else:# islandans += 1search_island(x,y)print(ans)for line in visited:print(line)

例题 2:最少的1(蓝桥杯第13届国赛)

题目描述:

给定1个正整数 n n n,找出所有 n n n的倍数中,用二进制表示法表示下1的个数最少是多少?

输入格式:

输入一行包含一个整数 n n n

输出格式:

输出一行包含一个整数表示答案

解题思路:
二进制数的特殊进位方式 + 同余最短路径
易知直接研究n的倍数的二进制进位是很难的,在进位过程中1的个数并没有明确的规律,需要绕开进位思考
注意到2进制数的递推有两种形式:
1.二进制01串末位是0,可以选择将0变为1或在末尾加1个0
2.二进制01串末位是1,只能在末尾加1个0
这个进位规则可以覆盖到所有的数,所以是一种有效的规则,尽管它在数值上不是递增的,但由于避免了进位,所以在1的个数上是不减的
这两种递推关系可以生成一棵树,每条边权值为1,第一个通过这种方式被找到的n的倍数拥有最少的1,题目由此变成最短路径问题,可以使用BFS解决

代码示例:

from collections import dequen = int(input())
# 创建一个数组存储n取模后不同余数所对应的最短路径
# 本题所要求的就是 mindist[0]
mindist = [float('inf') for i in range(10)]
# 引入双端队列,以便体现两种迭代方式在优先级上差别
q = deque()
# 同余最短路径
q.append((1%n, 1)) # start from 1
while q:k,t = q.popleft()if mindist[k] <= t:# 直接舍弃,一定不是最优路径continuemindist[k] = tif k&1:# k is oddq.appendleft(((k*2)%n, t))else:q.appendleft(((k*2)%n, t))q.append(((k+1)%n, t+1))
print(mindist[0])

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

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

相关文章

Parade Series - SVG Resource

iconfont https://www.iconfont.cn/?spma313x.search_index.i3.2.74e53a819tkkcG音符 <div class"form-group"><a href"Javascript:reload();" class"btn btn-icon btn-outline-light btn-block" style";"><svg t&q…

打造快乐成长的乐园:探索少儿教育项目的魅力

在当今社会&#xff0c;家长们越来越重视孩子的全面发展和个性培养&#xff0c;少儿教育项目因其独特的魅力吸引着越来越多的关注。本文将探讨少儿教育项目的特点、重要性&#xff0c;以及如何打造一个快乐成长的教育乐园。 ### 少儿教育项目的价值 少儿教育项目不仅仅是传授…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 一、简单介绍 二、简单闪烁效果实现原理 三、简单闪烁效果案例实现简单步骤 四、注意事项 一、简单…

如何应对复杂软件工程的开发流程?

应对复杂软件工程的开发流程通常需要一个结构化和系统化的方法。这种方法不仅包括采用合适的技术和工具&#xff0c;还涉及到项目管理、团队协作、需求分析、设计、实施、测试、部署和维护等多个方面。以下是一些关键步骤&#xff0c;以及如何将这些步骤应用于使用LabVIEW进行软…

JAVA数据篇-队列Queue使用

文章目录 前言一、队列使用&#xff1a;二、队列元素的存入&#xff1a;三、队列元素的取出&#xff1a;三、队列数据实现类&#xff1a;非并发安全的队列&#xff1a;并发安全的队列&#xff1a; 总结 前言 在 Java 中&#xff0c;队列&#xff08;Queue&#xff09;是一种用…

Pyenv的安装和使用

Pyenv是一个简单的Python版本管理工具。通过Pyenv可以安装多个版本的Python&#xff0c;并且可以在多个版本之间轻松切换。所用操作系统&#xff1a;Ubuntu 22.04。 1. 安装Pyenv 1.1 说明 a) Pyenv支持UNIX/LINUX/MacOS系统&#xff0c;并未支持Windows操作系统&#xff0c;…

【开发篇】十二、GCeasy报告分析

文章目录 1、图一&#xff1a;正常情况2、图二&#xff1a;缓存对象过多3、图三&#xff1a;内存泄漏4、图四&#xff1a;频繁持续Full GC5、图五&#xff1a;元空间不足导致的Full GC 1、图一&#xff1a;正常情况 正常的堆内存如图&#xff1a; 锯齿状对象创建后内存占用上…

【PostgreSQL】- 1.2 PostgreSQL 配置单独的数据库存储

在 Debian 或其它 Linux 系统上&#xff0c;为数据库创建一个单独的挂载点&#xff08;如 /opt/pgdata&#xff09;并将一块大容量硬盘挂载到这个目录有几个优点&#xff1a;数据隔离、性能优化、备份和恢复、安全性。 因此接上篇 “【PostgreSQL】- 1.1 在 Debian 12 上安装 P…

基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析

目录 不同子串 辗转相除法-求最大公约数 二叉树非递归前序遍历 不同子串 从a开始&#xff0c;截取 a aa aaa aaab 从第二个下标开始a aa aab 从第三个 a ab 从第四个 b 使用set的唯一性&#xff0c;然后暴力遍历来去去重&#xff0c;从第一个下标开始截取aaab a aa aaa aaab…

【JS】数组详解

前言 数组是js中最常用到的数据集合&#xff0c;它是引用数据类型的一种&#xff08;其他二者为Object和Function&#xff09;&#xff0c;但其本质是Object。 一、数组的组成 数组由三部分组成&#xff0c;分别是索引、元素和length。 索引&#xff1a;用于标识元素&#xf…

ES学习日记(三)-------第三方插件选择

前言 在学习和使用Elasticsearch的过程中&#xff0c;必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求&#xff0c;未免太过麻烦&#xff0c;而且也不够人性化。 目前我了解的比较主流的插件就三个,head,cerebor和elasticHD 1.head 老牌插件,功能…

原生js实现循环滚动效果

原生js实现如下图循环滚动效果 核心代码 <div class"scroll"><div class"blist" id"scrollContainer"><div class"bitem"></div>......<div class"bitem"></div></div> </di…

Long long类型比较大小

long 与 Long long类型和Long类型是不一样&#xff0c;long类型属于基本的数据类型&#xff0c;而Long是long类型的包装类。 结论 long是基本数据类型&#xff0c;判断是否相等时使用 &#xff0c;即可判断值是否相等。&#xff08;基本数据类型没有equals()方法&#xff0…

局域网找不到共享电脑怎么办?

局域网找不到共享电脑是一种常见的问题&#xff0c;给我们的共享与合作带来一定的困扰。天联组网技术可以解决这个问题。本文将介绍天联组网的原理和优势&#xff0c;并探讨其在解决局域网找不到共享电脑问题中的应用。 天联组网的原理和优势 天联组网是一种基于加速服务器的远…

基于Pytorch的验证码识别模型应用

前言 在做OCR文字识别的时候&#xff0c;或多或少会接触一些验证码图片&#xff0c;这里收集了一些验证码图片&#xff0c;可以对验证码进行识别&#xff0c;可以识别4到6位&#xff0c;纯数字型、数字字母型和纯字母型的一些验证码&#xff0c;准确率还是相当高&#xff0c;需…

第14章动态规划

动态规划 确定递推状态&#xff1a; f(n)解释 确定递推公式 程序实现 优化&#xff1a; 去除冗余状态 状态重定义 优化转移过程 斜率优化 优化-递归记忆化 if arr[n] return arr[n]递归记忆化(正向求解-递归) 或 改变求解顺序&#xff08;逆向递归求解-循环&#xff09; &…

STM32 PWM通过RC低通滤波转双极性SPWM测试

STM32 PWM通过RC低通滤波转双极性SPWM测试 &#x1f4cd;参考内容《利用是stm32cubemx实现双极性spwm调制 基于stm32f407vet6》&#x1f4fa;相关视频链接&#xff1a;https://www.bilibili.com/video/BV16S4y147hB/?spm_id_from333.788 双极性SPWM调制讲解以及基于stm32的代码…

基于 RisingWave 和 ScyllaDB 构建事件驱动应用

概览 在构建事件驱动应用时&#xff0c;人们面临着两大挑战&#xff1a;1&#xff09;低延迟处理大量数据&#xff1b;2&#xff09;实现流数据的实时摄取和转换。 结合 RisingWave 的流处理功能和 ScyllaDB 的高性能 NoSQL 数据库&#xff0c;可为构建事件驱动应用和数据管道…

cts 运行时 有时候 aapt2 的问题

05-04 16:30:18 E/AaptParser: aapt2 dump badging stderr: W/ziparchive(1050736): Unable to open ‘badging’: No such file or directory badging: error: No such file or directory. 05-04 16:30:18 E/AaptParser: Failed to run aapt2 on /xxx/android-gts/tools/./…/…

阿里云发送短信配置

依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.2.1</version> </dependency> <dependency><groupId>org.apache.httpcomponents</groupId&g…