蓝桥杯备赛_python_DFS搜索算法_刷题学习笔记

1.是什么

  • 沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。
  • 并且每个节点只能访问一次。
  • 本质上是持续搜索,遍历了所有可能的情况,必然能得到解。
  •  流程是一个树的形式,每次一条路走到黑。
  •  目的主要是达到被搜索结构的叶结点直到最后一层,然后回退到上层,被 访问过的节点会被标记,然后查看是否有其他节点,如果有则继续下一层 ,直到最后一层。一次类推直到所有节点都被查找。
  • 后访问的节点,其邻接点先被访问。
  • 根据深度优先遍历的定义,后来的先搜索(栈、递归)(先进后出)
  1. 初始化图中的所有节点为均未被访问。
  2. 从图中的某个节点v出发,访问v并标记其已被访问
  3. 依次检查v的所有邻接点w,如果w未被访问,则从w出发进行
  4. 深度优先遍历(递归调用,重复步骤(2)和(3))。

2.学习案例

2.1问题

        

2.2求解思路

每一个坐标都有上下左右四个方向可以走,如果不是障碍物那么可以视作有效的步数,一直往前走的过程中要注意标记已经访问过后的坐标,在回溯的时候也要注意将坐标清除标记。

2.3代码实现

start_x, start_y, end_x, end_y = map(int, input().split())
maps = []
for i in range(5):
    l = list(map(int,input().split()))
    maps.append(l)

min = 9999999
vis = [[0 for _ in range(4)] for _ in range(5)]
def dfs(x,y,step):
    global min, vis
    d = [(0,1),(1,0),  (0,-1),(-1,0) ]
    if x == end_x-1 and y == end_y-1:
        if step<min:
            min = step
        return
    for xx, yy in d:
        dx = x+xx
        dy = y+yy
        if 0 <= dx < 5 and 0 <= dy < 4:
            if maps[dx][dy] == 0 and vis[dx][dy] == 0:
                vis[dx][dy] = 1
                dfs(dx, dy, step + 1)
                vis[dx][dy] = 0
    return

dfs(start_x-1,start_y-1,0)
print(min)

输入:

1 1 4 3
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

输出:

7

3.刷题笔记

3.1全球变暖

6.全球变暖 - 蓝桥云课 (lanqiao.cn)

求解思路 :

        与其说他是一道深搜的题,我觉得更应该归类为栈模拟的题目,在搜索的过程中主要是栈模拟从而实现深度优先搜索。

        这道题是要求求出有多少岛屿会被淹没,换个思路来想的话什么样的岛屿会被淹没,什么样的岛屿不会被淹没。题目中这一个条件很关键(岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。)所以我们就可以总结出如果岛屿中存在一块上下左右四个方向一个像素的距离都是陆地的一个岛屿,那么这一块不会被淹没,我们可以把它当作一个高地。

        而所谓的岛屿就是周围是海洋,由陆地联通起来的区域,所以在计算时需要建立一个访问标记数组用来做标记。

n = int(input())
maps = []
for i in range(n):
    l = list(input())
    maps.append(l)

vis = [[0]*n for _ in range(n)]
d = [(1,0),(-1,0),(0,1),(0,-1)]
def dfs(x,y):
    stack = [(x,y)]
    noHigh = True
    while stack:
        tx, ty = stack.pop()
        if maps[tx - 1][ty] == '#' and maps[tx + 1][ty] == '#' and maps[tx][ty + 1] == '#' and maps[tx][ty - 1] == '#':
            noHigh = False
        for xx, yy in d:
            dx = tx + xx
            dy = ty + yy
            if maps[dx][dy] == '#' and vis[dx][dy] == 0:
                vis[dx][dy] = 1
                stack.append((dx,dy))
    return noHigh

ans = 0
for i in range(1,n-1):
    for j in range(1,n-1):
        if maps[i][j] == '#' and vis[i][j] == 0:
            if dfs(i,j):
                ans += 1
print(ans)

3.2玩具蛇

0玩具蛇 - 蓝桥云课 (lanqiao.cn)

求解思路

        这道题有点像1到16这些数字的全排列。如果16个数字的排完之后就可以认为是一种方案,而排完一个的下一个的位置可以选择四种(上下左右),这就会体现深度优先搜索,一条路走到黑然后再慢慢的回溯。

        而我们传入的值是什么,是第一个数字的位置以及现在已经有多少个数字完成了排列。     

d = [(1,0),(-1,0),(0,1),(0,-1)]
ans = 0
vis = [[0]*4 for _ in range(4)]
def dfs(x,y,count):
    global ans
    if count == 16:
        ans += 1
        return
    for xx, yy in d:
        dx = x+xx
        dy = y+yy
        if 0<=dx<4 and 0<=dy<4 and vis[dx][dy] == 0 :
            vis[dx][dy] = 1
            dfs(dx,dy,count+1)
            vis[dx][dy] = 0

for i in range(4):
    for j in range(4):
        vis[i][j] = 1
        dfs(i,j,1)
        vis[i][j] = 0

print(ans)

3.3最大连通

7.最大连通 - 蓝桥云课 (lanqiao.cn)

求解思路:

        做到这道题的时候我突然对深搜有了一点点的想法,仔细观察了之前两道题得到代码,我们 可以知道一个用栈进行了存储,而有一个是非常典型的深搜在一条路上走到黑。至于根本的区别我还没想到可能需要做更多的题目才能总结出来的。

        做这道题的时候,我一开始用的是典型的深搜在一条路上走到黑,但是不行,我也不知道是为什么,然后就换了栈模拟的这种,然后就可以。还不知道是为什么,,,,

flag = [[0]*60 for _ in range(30)]
maps =[
"110010000011111110101001001001101010111011011011101001111110",

"010000000001010001101100000010010110001111100010101100011110",

"001011101000100011111111111010000010010101010111001000010100",

"101100001101011101101011011001000110111111010000000110110000",

"010101100100010000111000100111100110001110111101010011001011",

"010011011010011110111101111001001001010111110001101000100011",

"101001011000110100001101011000000110110110100100110111101011",

"101111000000101000111001100010110000100110001001000101011001",

"001110111010001011110000001111100001010101001110011010101110",

"001010101000110001011111001010111111100110000011011111101010",

"011111100011001110100101001011110011000101011000100111001011",

"011010001101011110011011111010111110010100101000110111010110",

"001110000111100100101110001011101010001100010111110111011011",

"111100001000001100010110101100111001001111100100110000001101",

"001110010000000111011110000011000010101000111000000110101101",

"100100011101011111001101001010011111110010111101000010000111",

"110010100110101100001101111101010011000110101100000110001010",

"110101101100001110000100010001001010100010110100100001000011",

"100100000100001101010101001101000101101000000101111110001010",

"101101011010101000111110110000110100000010011111111100110010",

"101111000100000100011000010001011111001010010001010110001010",

"001010001110101010000100010011101001010101101101010111100101",

"001111110000101100010111111100000100101010000001011101100001",

"101011110010000010010110000100001010011111100011011000110010",

"011110010100011101100101111101000001011100001011010001110011",

"000101000101000010010010110111000010101111001101100110011100",

"100011100110011111000110011001111100001110110111001001000111",

"111011000110001000110111011001011110010010010110101000011111",

"011110011110110110011011001011010000100100101010110000010011",

"010011110011100101010101111010001001001111101111101110011101"]

d = [(1,0),(-1,0),(0,1),(0,-1)]
def dfs(x,y):
    stack = [(x,y)]
    count = 0
    while stack:
        tx, ty = stack.pop()
        for xx,yy in d:
            dx = tx+xx
            dy = ty+yy
            if 0<=dx<30 and 0<=dy<60:
                if maps[dx][dy] == '1' and flag[dx][dy] == 0:
                    flag[dx][dy] = 1
                    count += 1
                    stack.append((dx,dy))
    return count

max = 0
for i in range(30):
    for j in range(60):
        if maps[i][j] == '1' and flag[i][j] == 0:
            count = dfs(i,j)
            if count>max:
                max = count

print(max)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哈尔滨工业大学 《材料物理》 笔记-3

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 量…

杨氏矩阵的查找(复杂度<O(N))

题目&#xff1a; 解释&#xff1a;时间复杂度小于O(N)即不要一个一个的去遍历查找。 思路&#xff1a; 一个33的二维数组如图所示&#xff1a; 一&#xff1a;先找到一个最关键的数字&#xff0c;3&#xff08;下标为0,2&#xff09; 关键数的关键之处在于&#xff08;处于…

【Unity】从0到1的横版2d制作笔记-DAY1

写在前面&#xff1a; 感谢旻子提供的Unity2d课程捏&#xff0c;红豆泥阿里嘎多 创建项目 测试Visual Studio的使用 右键选择【create】&#xff0c;右键创建C# Script&#xff0c;待文件创建完毕后双击查看能否正确跳转。 正确跳转的结果是能看见代码中注释标注有&#xff1a;…

15届蓝桥杯第二期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

(56)删除每行中的最大值

文章目录 1. 每日一言2. 题目3. 解题思路4. 代码5. 结语 1. 每日一言 抱怨过去发生的一切&#xff0c;就等于丧失了力量&#xff0c;白白浪费了往事要带给我们的成长。 2. 题目 题目链接&#xff1a;删除每行中的最大值 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正…

线程工具类与原子类

参考文档&#xff1a; CountDownLatch、CyclicBarrier、Semaphore的用法和区别juc15_基本AtomicInteger、数组、引用AtomicStampedReference、对象的属性修改原子类 AtomicIntegerFieldUp 、原子操作增强类LongAdder 辅助工具类 CountDownLatch(闭锁) 做减法 允许一个或多个…

c语言文件操作(2)

1.文件的随机读写&#xff1a; fseek函数 int fseek ( FILE * stream, long int offset, int origin ); fseek函数是根据文件指针的位置和偏移量来定位文件指针。 其中&#xff0c;origin所含的参数&#xff1a; seek_set&#xff1a;文件开头 seek_cur&#xff1a;文件指…

DFS-重复覆盖模型

糖果 1243. 糖果 - AcWing题库 首先是最暴力的做法&#xff0c;我们枚举所有的选法&#xff0c;当某种选法可以尝到所有口味的糖果时&#xff0c;比较当前购买的糖果数和当前的res&#xff0c;迭代出res的最小值。这样进行搜索的话&#xff0c;最极端的状态下树的深度是n&…

腾讯云服务器多少钱1个月?2024一个月收费阿济格IE吧

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

easyrecovery15易恢复中文绿色版 数据恢复软件易恢复 Ontrack EasyRecovery汉化破解版下载 易恢复软件免费版

易恢复 Ontrack EasyRecovery 由世界著名数据恢复公司 Ontrack 出品的威力非常强大的硬盘数据恢复软件。EasyRecovery 15破解版具备强大的磁盘诊断、数据恢复、文件修复功能。Ontrack EasyRecovery 能够帮你恢复由于误操作删除的&#xff0c;或者说格式化选成丢失的数据以及重建…

ASP .Net Core ILogger日志服务

&#x1f433;简介 ILogger日志服务是.NET平台中的一个内置服务&#xff0c;主要用于应用程序的日志记录。它提供了灵活的日志记录机制&#xff0c;允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件&#xff1a; ILogger接口&#xff1a;这是ILogger日志服…

Nacos下载和安装

&#xff08;1&#xff09;下载地址和版本 下载地址&#xff1a;Releases alibaba/nacos GitHub 解压在没有中文及空格的文件夹 &#xff08;2&#xff09;启动nacos服务 在bin目录下,打开命令行,输入 启动命令&#xff1a;sh startup.sh -m standalone - Linux/Unix/Mac …

(总结)OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT&#xff0c;仅供学习参考。

3.19总结

A计划 题解&#xff1a;这题其实就是一个很简单的三维搜索&#xff0c;有了一个传送门&#xff0c;并且要确定是否传过去的对应位置是墙&#xff0c;防止被装死&#xff0c;同事呢又要在对应的t时间内完成&#xff08;不一定要卡着t时间恰好完成&#xff09; #include<ios…

鸿蒙实战开发:【FaultLoggerd组件】讲解

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口 Si…

内存泄漏检测、单向链表的操作

我要成为嵌入式高手之3月19日数据结构第二天&#xff01;&#xff01; ———————————————————————————— valgrind内存测试工具 让虚拟机上网、在虚拟机上下载软件&#xff0c;参考笔记&#xff1a; 我要成为嵌入式高手之2月3日Linux高编第一天&am…

IPD集成产品开发:塑造企业未来竞争力的关键

随着市场竞争的日益激烈&#xff0c;企业对产品开发的要求也越来越高。如何在快速变化的市场环境中&#xff0c;既保证产品的批量生产效率&#xff0c;又满足客户的个性化需求&#xff0c;成为了企业面临的重要挑战。IPD&#xff08;集成产品开发&#xff09;模式&#xff0c;作…

【单点知识】基于实例讲解PyTorch中的Transforms类

文章目录 0. 前言1. 基本用法1.1 转换为Tensor1.2 图像大小调整1.3 随机裁剪1.4 中心裁剪1.5 随机翻转1.6 随机旋转1.7 填充1.8 组合变换 2. 进阶用法2.1 归一化2.2 色彩空间转换2.3 颜色抖动2.4 随机仿射2.5 透视变换2.6 自定义变换 0. 前言 按照国际惯例&#xff0c;首先声明…

Linux 常用操作命令大全

目录 一、命令大集合 1.1 whereis 1.2 which 1.3 sudo 1.4 grep 1.5 free 1.6 top 动态显示进程的状态 1.7 ps 静态显示进程信息 1.8 df 1.9 iostat 看IO性能状态 1.10 yum安装插件命令 1.11 rpm 1.12 scp远程拷贝 1.13 uname 二、linux网络命令 2.1 centos7 防火…

数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。 作者&#xff1a;JORDAN TIGANI&#xff0c;DuckDB 公司 MotherDuck 联合创始人&CEO 本文和封面来源&#xff1a;https://motherduck.com/&#xff0c;爱可生开源社区翻译。 本文约 4500 字&#xff0c;预…