【蓝桥模板】——迷宫逃脱夺命3问,你能坚持到哪1问?(BFS模板)

 大家好,我是爱分享的小蓝,欢迎交流指正~ 

全文目录🧭

🎁说在前面

🏆模板-BFS迷宫⭐

🚀传送锚点​

 💡思路点拨

🍞代码详解  

🏆走迷宫Ⅰ⭐

🚀传送锚点

 💡思路点拨

🍞代码详解  

🏆走迷宫Ⅱ⭐

🚀传送锚点

 💡思路点拨

🍞代码详解  

🏆走迷宫Ⅲ⭐

🚀传送锚点

 💡思路点拨

🍞代码详解  

 🏆扩散⭐⭐

🚀传送锚点

 💡思路点拨

🍞代码详解  

 🏆全球变暖⭐⭐⭐

🚀传送锚点​

 💡思路点拨

🍞代码详解 


🎁说在前面

鸽了一个星期的BFS模板,小蓝肝了10小时终于写完啦!q(≧▽≦q)

看了十几份题解,调试了上百次程序,终于把原本四十行的代码,精简压缩成20行模板 \^o^/

但小蓝调试的时候,出现好多BUG,研究了几个小时才找到错误原因解决(ToT)/~~~

如果没有人指导的话,友友很可能会跟我一样,掉到BUG坑里几小时出不来🕳🕳🕳

所以为了节约友友的宝贵学习时间,多腾出些时间可以出去嗨皮~(╹ڡ╹ )

小蓝把思路,代码,细节,BUG 都写在文章里了(●'◡'●)

朋友只需耐心看完下面的文章即可👇

祝大家成功逃出迷宫😎


🏆模板-BFS迷宫⭐

🚀传送锚点

 💡思路点拨

一、参数解释:

M:map地图     G:go走过路径      q=deque():双向队列   q.popleft() 头节点从左边出队

二、详细思路:

1.前期准备,先导入数据结构双向队列deque,然后输入题目要求的一堆参数。

2.初始化,创建双向队列,同时赋初值:迷宫开始坐标(0,0)。

3.模拟队列,x,y分别代表队列里出队结点的x坐标,和y坐标。

4.设置结束条件,遍历到迷宫出口(n-1,m-1),打印步数,打印走过的路径。

5.下一步路,遍历可以走的四个方向,得到下一个坐标(a,b)。

6.判断合理,判断坐标是否越界,是否之前遍历过。

7.迭代赋值:判断合理就进行标记,然后添加到队列最后,路径表上增加此刻的方向。

三、细节注意:

代码模板很细节,稍不注意就会出现BUG!小蓝作为三个坑🕳🕳🕳都踩过的过来人,

来跟大家数数一共有哪些题目里的大坑(ง •_•)ง(没说到的BUG欢迎评论区一起交流)

第一个坑🕳:为什么要用双向队列deque,列表list不可以吗?

答:用列表模拟队列,运行速度较慢,答题会超时,得不了满分。

而从collections导入deque运行速度较快,程序不会超时,可以得满分。

第二个坑🕳:q=deque([(0,0)])怎么这么多的括号?都是啥意思?

([(0,0)])像个三明治,先外面套一层deque()函数小括号,

然后里面夹一层列表中括号[ ],最后再加一层代表坐标点小括号().

第三个坑🕳:遍历四个方向也啥要注意的?

for i,j,k in [(1,0,'D'),(0,-1,'L'),(0,1,'R'),(-1,0,'U')]:

小蓝调试半天才发现这个错误,为了避免友友掉进同样的坑,小蓝温馨提醒一下要看题目条件:“如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。

遍历顺序按字典序 D→L→R→U,也就是下↓左←右→上↑。

🍞代码详解  

#BFS-迷宫模板
from collections import deque
n,m=map(int,input().split())
M=[[int(i) for i in input()] for j in range(n)]
G=[['']*m for i in range(n)]
q=deque([(0,0)])
while q:x,y=q.popleft()if x==n-1 and y==m-1:print(len(G[-1][-1]))print(G[-1][-1])breakfor i,j,k in [(1,0,'D'),(0,-1,'L'),(0,1,'R'),(-1,0,'U')]:a,b=x+i,y+jif 0<=a<n and 0<=b<m and M[a][b]==0:M[a][b]=1q.append((a,b))G[a][b]=G[x][y]+k
'''
样例输入:
3 3
001
100
110
样例输出:
4
RDRD
'''

🏆走迷宫Ⅰ⭐

🚀传送锚点

010000
000100
001001
110000

 💡思路点拨

下面这道题就是模板的经典例题,简直是为模板量身定做的ヾ(≧▽≦*)o

假如考场上碰到,别人想个半小时,你直接套个BFS模板,5分钟直接轻松拿捏✪ ω ✪

小蓝建议先自己敲一遍模板,然后稍微改改几个地方,应该就AC了(๑•̀ㅂ•́)و✧

🍞代码详解  

#BFS-迷宫
from collections import deque
n,m=30,50
M=[[int(i) for i in input()] for j in range(n)]
G=[['']*m for i in range(n)]
q=deque([(0,0)])
while q:x,y=q.popleft()if x==n-1 and y==m-1:print(G[-1][-1])breakfor i,j,k in [(1,0,'D'),(0,-1,'L'),(0,1,'R'),(-1,0,'U')]:a,b=x+i,y+jif 0<=a<n and 0<=b<m and M[a][b]==0:M[a][b]=1q.append((a,b))G[a][b]=G[x][y]+k
'''
样例输入:
01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000
样例输出:
print('DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR')
'''

🏆走迷宫Ⅱ⭐

🚀传送锚点

 💡思路点拨

上面的两题都是求最小路径方向(●'◡'●)

下面两题换个问法:求最小走格子次数(●ˇ∀ˇ●)

需要更改模板里的一些参数👇

q=deque([(x1-1,y1-1,0)]) 加一个0代表遍历次数。

x,y,z=q.popleft()  从队列取出来一个结点分为三部分,分别是x坐标,y坐标,和遍历次数。

q.append([a,b,z+1]) 注意迭代时遍历次数z+1。

🍞代码详解  

#BFS-走迷宫Ⅱ
from collections import deque
n,m=map(int,input().split())
M=[list(map(int,input().split())) for i in range(n)]
x1,y1,x2,y2=map(int,input().split())
q=deque([(x1-1,y1-1,0)])
while q:x,y,z=q.popleft()if x==x2-1 and y==y2-1:print(z)breakfor i,j in [[1,0],[-1,0],[0,1],[0,-1]]:a,b=x+i,y+jif 0<=a<n and 0<=b<m and M[a][b]==1:M[a][b]=0q.append((a,b,z+1))
if (x,y)!=(x2-1,y2-1):print(-1)
'''
样例输入:
5 5 
1 0 1 1 0
1 1 0 1 1 
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5
样例输出:
8
'''

🏆走迷宫Ⅲ⭐

🚀传送锚点

 💡思路点拨

下面来到验证题,主要检测上一题的掌握情况~

自己先做一下,学会了上一题很简单,换汤不换药,改改参数就AC了~

🍞代码详解  

#BFS-走迷宫Ⅲ
from collections import deque
n,m=map(int,input().split())
M=[[i for i in input()] for i in range(n)]
q=deque([(0,0,1)])
while q:x,y,z=q.popleft()if x==n-1 and y==m-1:print(z)breakfor i,j in [[1,0],[-1,0],[0,1],[0,-1]]:a,b=x+i,y+jif 0<=a<n and 0<=b<m and M[a][b]=='.':M[a][b]='#'q.append((a,b,z+1))
'''
样例输入:
5 5
..###
#....
#.#.#
#.#.#
#.#..
样例输出:
9
'''

 🏆扩散⭐⭐

🚀传送锚点

 💡思路点拨

前三道迷宫题,只是BFS新手入门题,算是餐前小吃,开开胃~

现在上一道正菜,前年国赛的填空题:扩散。

主要用到两个数据结构:集合双向队列

选取集合容器来存储是因为它速度快,选取双向队列还是因为它速度快,

反正速度快就对了,大约半分钟就能跑完φ(* ̄0 ̄)

而如果选取列表可能要跑几分钟,估计考试的时候心态就崩了(っ °Д °;)っ(反正我会崩)

下面简单讲一下思路:

先将小蓝画布上有的4个黑点初始化,存到标记集合V和双向队列q里。

然后开始BFS搜索,如果循环2020次,就结束打印黑格子个数。

遍历四个方向,没标记,增加标记并加入队列。黑格子计数器+1.

🍞代码详解  

#BFS-扩散
from collections import deque                           #导入双向队列
V={(0,0),(2020,11),(11,14),(2000,2000)}                 #V:visited标记集合
q=deque([(0,0,0),(2020,11,0),(11,14,0),(2000,2000,0)])  #q:deque双向队列
cnt=4                                                   #初始黑格数
while q:                                                #队列非空x,y,z=q.popleft()                                   #(0,0,0)if z==2020:                                         #终止条件print(cnt)                                      #print(20312088)break                                           #结束循环for i,j in [[1,0],[-1,0],[0,1],[0,-1]]:             #遍历四周a,b=x+i,y+j                                     #取新坐标if (a,b) not in V:                              #没有标记V.add((a,b))                                #增加标记q.append((a,b,z+1))                         #加入队列cnt+=1                                      #黑格子+1  

 🏆全球变暖⭐⭐⭐

🚀传送锚点

 💡思路点拨

最后一道三星省赛真题,挑战大BOSS了 !(╯‵□′)╯嘟嘟炸弹!•••*~●

总体思路:(≧∀≦)ゞ

从问题出发,题目问:“多少个岛屿会被全部淹没?”

先判断全部淹没的条件:当前格子是是'#',上下左右四个格子都是'.'的岛屿。

基本思路:φ(* ̄0 ̄)

二重循环遍历每一个坐标点,如果遇到岛屿,就进行BFS搜索,满足条件统计相加。

注意细节:(~ ̄▽ ̄)~

因为岛屿是一整个连通块,所以要一块一块地遍历。

(岛屿是指连在一起的###,不是单独的一个岛#)

🍞代码详解  

#BFS-全球变暖
from collections import deque
n=int(input())
M=[[i for i in input()]for j in range(n)]
vis=[[0]*n for i in range(n)]   #标记列表
flag=True                       #淹没标志
def bfs(x,y):global flagq=deque([(x,y)])            #初始化开始遍历的坐标while q:x,y=q.popleft() if M[x][y+1]=='#' and M[x][y-1]=='#' and M[x+1][y]=='#' and M[x-1][y]=='#':flag=False          #如果格子的四个方向有岛屿,中间的高地不会被淹没for i,j in [(0,1),(0,-1),(1,0),(-1,0)]:a,b=x+i,y+jif vis[a][b]==0 and M[a][b]=='#':vis[a][b]=1     #标记岛屿遍历过了q.append((a,b)) #遍历下一个岛屿
ans=0
for i in range(n):              #遍历每一个格子for j in range(n):if vis[i][j]==0 and M[i][j]=='#':flag=True           #设置淹没标志bfs(i,j)            #搜索这个格子,判断是否需要更改淹没标志if flag==True:      #如果淹没标志不变ans+=1          #被淹岛屿数量加1print(ans)
'''
样例输入:
7
.......
.##....
.##....
....##.
..####.
...###.
.......样例输出:
1
'''

  ​​ 友友们,备战蓝桥最后10天,一起冲刺省赛一等奖!​​

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

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

相关文章

MVSNet 和 PatchMatchNet 的DTU数据集 几个不同之处 一定要注意

文章目录 1 测试集 数据加载不同2 训练集 数量 分辨率不同 1 测试集 数据加载不同 1.MVSNet 的DTU测试数据集和PatchmatchNet测试数据集不一样&#xff1b; 区别在于数据加载&#xff0c;前者 cams文件最后是最小深度和间隔&#xff0c;后者是最小深度和最大深度。 2 训练集 …

最强嘴提o.o文字转语音

下载 链接&#xff1a;https://pan.baidu.com/s/1cb24WW2dihtRpMz4giMxyw 提取码&#xff1a;k3xu 解压密码&#xff1a;领航员未鸟 项目源码&#xff1a;https://github.com/Plachtaa/VITS-fast-fine-tuning/tree/main 使用 解压后来到&#xff0c;该目录下&#xff0c;把…

覆盖诊所全流程管理,适合中大型诊所门诊的门诊管理系统

诊所全流程管理查询 从线上与线下的角度入手&#xff0c;一套合格好用的诊所管理系统包括互联网医疗的线上咨询问诊、预约挂号&#xff0c;并且还有线下的患者登记、病历处方录入、药品进销存、财务报表等管理&#xff0c;将各位患者的信息数据在平台共享&#xff0c;方便医生…

医生病人管理系统MySQL设计_医院门诊管理系统的设计与实现(JSP,MySQL)(含录像)

医院门诊管理系统的设计与实现(JSP,MySQL)(含录像)(毕业论文6800字,程序代码,MySQL数据库) 随着信息化的飞速发展和普遍使用&#xff0c;计算机在各行各业得到越来越广泛的应用&#xff0c;医疗卫生领域作为实现信息化的重点&#xff0c;医院面临信息时代的挑战&#xff0c;医院…

门诊分诊管理系统分诊台程序

其详细功能如下&#xff1a;1. 设置挂号数量警报线系统可以为每个科室的每个医生&#xff08;特别是专家号&#xff09;&#xff0c;设定挂号数量警报线。当就诊病人数量超过限定的数量时&#xff0c;计算机系统会自动报警来通知管理人员、护士、医生&#xff0c;以便及时提示护…

网络工程毕业设计 SSM疫情期间医院门诊管理系统(源码+论文)

文章目录 1 项目简介2 实现效果2.1 界面展示 3 设计方案3.1 概述3.2 系统开发流程3.3 系统结构设计 4 项目获取 1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的…

ssm java mysql_医院门诊管理系统_

息化不断建设发展的今天&#xff0c;医院看病预约&#xff0c;医生的挂号等&#xff0c;已经十分方便&#xff0c;通过在线挂号&#xff0c;医生的查看&#xff0c;就能够了解到医院的门诊基本信息&#xff0c;并且可以在线进行门诊的医生查看&#xff0c;医院最新的资讯等&…

java校园医院门诊管理系统ssm

系统分为用户&#xff0c;医生和管理员三个角色 1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户…

计算机毕业设计 SSM+MySQL毕业设计 疫情期间医院门诊管理系统

摘 要 21世纪的到来&#xff0c;国家的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;智能科技时代崛起的优势&#xff0c;医院门诊管理系统当然也不能排除在外。疫情期间医院门诊管理系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;…

基于javaweb+jsp的医院门诊病例管理系统

基于javawebjsp的医院门诊病例管理系统 JavaWeb JavaBean JSP MVC MySQL Tomcat JavaScript Bootstrap 基础JSPServlet或JSPSSM(Spring、SpringMVC、MyBatis)框架或JSPSSMMaven(pom.xml)框架或SpringBoot…均可修改 开发工具&#xff1a;eclipse/idea/myeclipse/sts等均可配…

涛然自得周刊(第06期):韩版苏东坡的突围

作者&#xff1a;何一涛 日期&#xff1a;2023 年 8 月 27 日 涛然自得周刊主要精选作者阅读过的书影音内容&#xff0c;不定期发布。历史周刊内容可以看这里。 电影 兹山鱼谱 讲述丁若铨因政治事件被贬黜到了遥远的黑山岛。来到岛上后&#xff0c;丁被大自然环境疗愈&#…

Springboot+vue的医院门诊管理系统的设计与实现(也有SpringCloud版本)

基于Springboot的门诊管理系统的设计与实现 Springboot(springcloud)vue的门诊管理系统的设计与实现系统整体功能设计患者端医生模块实现管理员模块实现 Springboot(springcloud)vue的门诊管理系统的设计与实现 由需求分析阶段可以得出本门诊管理系统的各功能模块如图4.1所示。…

基于springboot的医院门诊管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 系统功能…

计算机毕业设计 SSM疫情下医院门诊就医管理系统(源码+论文)

文章目录 1 前言2 实现效果3 设计方案4 最后 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的java web缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的java web管理系统达不…

C语言之函数题

目录 1.乘法口诀表 2.交换两个整数 3.函数判断闰年 4.函数判断素数 5.计算斐波那契数 6.递归实现n的k次方 7.计算一个数的每位之和&#xff08;递归&#xff09; 8.字符串逆序&#xff08;递归实现&#xff09; 9.strlen的模拟&#xff08;递归实现&#xff09; 10.求…

华为OD机试 - 求满足条件的最长子串的长度 - 双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

软考:中级软件设计师:信息系统的安全属性,对称加密和非对称加密,信息摘要,数字签名技术,数字信封与PGP

软考&#xff1a;中级软件设计师:信息系统的安全属性 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

亚马逊与Visa握手言和:亚马逊英国用户能继续使用Visa信用卡

NEW 关注Tech逆向思维视频号 最新视频→【波及美日&#xff0c;全域失联&#xff0c;30年最强的汤加火山为何爆发】 出品&#xff5c;网易智能 1月18日消息&#xff0c;此前有报道称美国电商亚马逊将于今年1月19日起停止在英国市场支持Visa信用卡。但当地时间周一亚马逊宣布英国…

CNN 01(CNN简介)

一、卷积神经网络的发展 convolutional neural network 在计算机视觉领域&#xff0c;通常要做的就是指用机器程序替代人眼对目标图像进行识别等。那么神经网络也好还是卷积神经网络其实都是上个世纪就有的算法&#xff0c;只是近些年来电脑的计算能力已非当年的那种计算水平…