11.深度优先搜索

news2024/11/17 16:14:09

一、算法内容

1.简介

深度优先搜索DFS(Depth First Search)按照深度优先的方式进行搜索,可以理解为“一条路走到黑”地穷举所有可行的方案,并不断尝试,直到找到一种情况满足问题问题的要求。那么这个方案就是一个问题的解。

2.递归与回溯

深度优先搜索可以用递归实现,而且几乎都是用递归实现,所以要学会深度优先搜索,首先必须要学会递归。但切忌将递归与深度优先搜索混为一谈。深度优先搜索和递归的区别是:深度优先搜索是一种算法,注重的是思想;而递归是一种基于编程语言的实现方式。

深度优先搜索最重要地就是回溯,它的作用是将状态恢复到上一级。你可以想象小时候玩迷宫游戏的行为,选择某一些路径进行尝试,如果不行就倒回来走其他的地方,这样倒回去的操作就是回溯。只有不断地尝试,不断地回溯才是一个完整的深度优先搜索。

如果将搜索的过程画出来,那么它就像一棵树,每一个结点都有相应的状态,分别代表了一种可能性。之所以叫做深度优先,是因为我们总是走到树的叶子处才开始返回,在树上就是先往深的地方走。
在这里插入图片描述

3.剪枝

在我们搜索的时候,理论上我们需要把所有的情况都考虑到,但是实际上,有一些情况我们不需要走到尽头就知道这是不合理的。就像走到树上的某一个位置之后,我们知道接下来无论走到哪里都不可能得到正确的答案了,那么就可以直接返回,相当于剪掉了搜索树上的一根树枝。

在这里插入图片描述

剪枝是搜索的精髓所在,如何更好地找到剪枝的策略会极大影响程序的时间复杂度。剪枝一般分为以下三种:

  • 可行性剪枝:如果按照这样的方案继续下去,不可能满足题目条件,那么剪枝。
  • 最优性剪枝:如果按照这样的方案继续下去,不可能比当前答案更有,那么剪枝。
  • 重复性剪枝:如果按照这样的方案继续下去,与此前某些时候相同,那么剪枝。

二、算法实现

1.算法模板

参数 dfs(变量)
{
    判断终点:
    	检查答案;
        返回;
    剪枝1:
    	返回;
    剪枝2:
    	返回;
    ...
    枚举:
    	条件检测:
            更新状态1;
            更新状态2;
            ...
            dfs();
            恢复状态1;
            恢复状态2;
    	...
}

2.实例剖析:P1605 迷宫

(1)限定条件

  • 不能走出迷宫,即任何时候,当前坐标 ( x , y ) (x,y) (x,y)满足 1 ≤ x ≤ n , 1 ≤ y ≤ m 1\leq x\leq n,1\leq y\leq m 1xn,1ym
  • 当走到终点的时候记录一次答案,并停止该分支。
  • 不能走到障碍物上面。
  • 注意不要原路返回,否则将进入无限循环。

(2)更新状态

若当前坐标为 ( x , y ) (x,y) (x,y),则下一步的坐标即为 ( x − 1 , y ) , ( x + 1 , y ) , ( x , y − 1 ) , ( x , y + 1 ) (x-1,y),(x+1,y),(x,y-1),(x,y+1) (x1,y),(x+1,y),(x,y1),(x,y+1)。我们需要在限定条件内走到这些位置。

而我们的状态分为两部分构成,结合这两个状态我们就可以唯一标识一种情况:

  • 第一部分:显然我们当前的坐标是我们的一个状态。
  • 第二部分:为了保证我们不要进入循环,我们需要标记我们的来路,这就是第二部分的状态。

(3)正解代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib> 
#include <cmath>

using namespace std;
typedef long long ll;
ll dx[4]={0,0,1,-1},dy[4]={-1,1,0,0};
ll mp[10][10];
ll ans,t,n,m;
ll fx,fy,sx,sy;
void dfs(ll x,ll y)
{
    if(x==fx && y==fy)
    {
        ans++;
        return;
    }
    else
    {
        for(ll i=0;i<4;i++)
        {
        	ll tx=x+dx[i];
        	ll ty=y+dy[i];
            if(tx>=1 && tx<=n && ty>=1 && ty<=m && mp[tx][ty]==0)
            {
            	mp[tx][ty]=1;
                dfs(tx,ty);
                mp[tx][ty]=0;
            }
        } 
    }
}
int main()
{
    cin>>n>>m>>t;
    cin>>sx>>sy>>fx>>fy;
    for(ll i=1;i<=t;i++)
    {
    	ll x,y;
        cin>>x>>y;
        mp[x][y]=1;
    }
    mp[sx][sy]=1;
    dfs(sx,sy);
    cout<<ans<<endl;
    
    return 0;
} 

三、作业

1.橙题

P1010 [NOIP1998 普及组] 幂次方

P1036 [NOIP2002 普及组] 选数

P1162 填涂颜色

P1605 迷宫

2.黄题

P1019 [NOIP2000 提高组] 单词接龙

P1219 [USACO1.5]八皇后 Checker Challenge

P1259 黑白棋子的移动

P1434 [SHOI2002] 滑雪

P1443 马的遍历

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

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

相关文章

shell 循环学习练习

目录 一&#xff0c;嵌套循环实现9*9乘法表 二&#xff0c;判定一个成绩&#xff1a; 三&#xff0c;循环创建用户&#xff1a;用户名为user01-user20 一&#xff0c;嵌套循环实现9*9乘法表 (for和while都可以) 选做&#xff1a;格式对齐&#xff0c;以及使用单层循环完成9*9乘…

精细管理——CRM销售漏斗管理

CRM销售漏斗涵盖了从接触客户到谈判、成单、回款的整个销售过程。一个典型的销售漏斗是由一个特定时间段里&#xff0c;例如一年或者一个季度或者一个月这个时间范畴之内&#xff0c;一系列有可能转化成订单的潜在销售机会所组成。在CRM客户管理系统中&#xff0c;销售漏斗管理…

Unity-TCP-网络聊天功能(四): 消息粘包、心跳机制保活(心跳包)、断线重连

8. 粘包Bug、心跳机制保活(心跳包)、断线重连粘包bug1&#xff1a;下线后&#xff0c;如果发送多条消息&#xff0c;在客户端上线时&#xff0c;一瞬间接收到&#xff0c;效果如同粘包&#xff0c;需要拆包。举例&#xff0c;连续发送三条160长度消息&#xff0c;可能实际显示2…

java常用类: System类直接常用方法

java常用类型: Ineteger等包装类 String类&#xff0c;StringBuffer类和StringBuilder类 Math类及常用方法 System类及常用方法 Arrays类及常用方法 BigInteger类和BigDecimal类及常用方法 日期类Date类,Calender类和LocalDateTime类 文章目录System简介System.exit(0) 退出Sys…

蓝桥杯重点(C/C++)(随时更新,更新时间:2023.2.2)

点关注不迷路&#xff0c;欢迎推荐给更多人&#xff0c;大约两天更新一次&#xff0c;建议点赞收藏加关注 本次更新内容&#xff1a;1.STL部分详细讲述&#xff0c;放到一篇新的文章中 2. 部分细节优化 目录 1 技巧 1.1 取消同步&#xff08;节约时间&#xff0c;甚至能多…

Shield UI for JavaScript 1.7.44 Crack

Shield UI for JavaScript Shield UI JavaScript 框架提供具有响应式设计的 JavaScript HTML5 组件&#xff0c;这些组件经过优化以获得最佳性能。 Shield UI 在 70 多种小部件类型中提供了最快和高度可定制的网格和图表控件。每个单独的控件都由行业领先的 24/7 支持包提供支持…

以莫罗湾为例,利用高精度地形高程模型应对海岸环境变化

Morro Bay是位于加州 San Luis Obispo附近的浅海河口区&#xff0c;存在大量野生动物&#xff0c;也是人们户外活动的好去处。但是沉积变化和鳗草&#xff08;大叶藻&#xff09;的大量消失对河口景观产生了不利影响。为了更好地认识环境改变的路径并提取修复对策&#xff0c;M…

2023年山东最新建筑八大员(资料员)考试试题题库及答案

百分百题库提供建筑八大员&#xff08;资料员&#xff09;考试试题、建筑八大员&#xff08;资料员&#xff09;考试预测题、建筑八大员&#xff08;资料员&#xff09;考试真题、建筑八大员&#xff08;资料员&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考…

Vue实战第3章:主页设计之顶部导航栏

主页设计之顶部导航栏 前言 本篇在讲什么 本篇文章主要来制作一个导航栏&#xff0c;具体效果就按照下图来处理吧 本篇适合什么 适合初学Vue的小白 想了解建站的同学 本篇需要什么 对Html语法有简单认知 对CSS语法有简单认知 对Vue有简单认知 依赖VS Code编辑器 本…

【redis6】第十三章(主从复制)

是什么 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 能干嘛 读写分离&#xff0c;性能扩展 容灾快速恢复 怎么玩 拷贝多个redis.conf文件include(写绝对路径) 开启daemonize yes Pi…

连接mysql5.7错误1045,重新设置root用户密码,已经springboot连接配置

错误&#xff1a; ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: NO) 原因是&#xff1a; 是因为数据库中用户密码的问题。所以我们可以跳过数据权限验证&#xff0c;重新设置一下 一、修改my.ini配置文件 停止mysql服务 方法&#xff…

GJB 5000B二级-PMC项目监控

一、主要变化情况 新增2项(红色)、拆分3项(蓝色)、移除2项(黄色)、合并9项(绿色) 新增的主要内容-2项 增加多资源计划的监控要求:   军用软件系统具体设备间联系紧密,测试验证环节多、要求高等特点,其研发和测试需要众多软硬件资源支持,而这些资源往往是影响…

ConcurrentHashMap1.7和1.8的不同实现

ConcurrentHashMap 在多线程环境下&#xff0c;使用HashMap进行put操作时存在丢失数据的情况&#xff0c;为了避免这种bug的隐患&#xff0c;强烈建议使用ConcurrentHashMap代替HashMap&#xff0c;为了对更深入的了解&#xff0c;本文将对JDK1.7和1.8的不同实现进行分析。 J…

FreeRTOS中断管理 | FreeRTOS五

目录 说明&#xff1a; 一、中断基础 1.1、中断理解 1.2、中断执行步骤 1.3、中断寄存器选择位 1.4、中断优先级分类 二、中断优先级分组设置 2.1、分类 2.2、特点 三、中断有关寄存器 3.1、SHPR1寄存器 3.2、SHPR2寄存器 3.3、SHPR3寄存器 3.4、FreeRTOS中配置Pe…

最优传输问题与Sinkhorn算法

目录引言例子&#xff1a;分甜点最优传输问题Sinkhorn算法Sinkhorn距离算法流程代码实验引言 最近看到一篇特征匹配相关的论文&#xff0c;思想是将特征匹配问题转化为最优传输问题求解&#xff0c;于是我去学习了一下最优传输问题。 本文主要是对博文 Notes on Optimal Trans…

4.6 QR分解二:Householder变换

1 Householder reflector Householder反射是这样子的(图片来自瑞典皇家理工学院)&#xff1a;   图中u是长度为1的向量。x是任意向量&#xff0c;H是u的Householder reflector。可见无论x是什么向量&#xff0c;HxHxHx始终除于和u正交的平面上。H和u的关系是&#xff1a; HI…

【z-library平替】Clibrary中文图书馆,电子书大全

目录1、z-library和Clibrary简介2、Clibrary网址3、具体操作界面1、z-library和Clibrary简介 喜欢阅读的盆友多多少少可能都听过z-library&#xff0c;书籍库非常全&#xff0c;而且是免费的&#xff0c;但是在z-library国内下线后&#xff0c;就一直没有找到合适的平替书库。 …

【vue2】vuex超超超级详解!(核心五大配置项)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vuex基础认识、state、getters、mutations actions、modules使用 目录(文末原素材) 一、…

新年找工作?python带你批量采集招聘数据

前言 大家早好、午好、晚好吖 ❤ ~ 必备素材: stealth.min.js 谷歌浏览器谷歌驱动selenium3.141.0 不知道怎么弄嘚同学可以私我获取哦~ 开发环境: python 3.8 pycharm 专业版 操作步骤 selenium 模块: 操作浏览器 打开一个浏览器 打开一个网址 获取数据 保存数据 …

性能测试工具-nmon

nmon 文章目录nmon介绍下载Linux系统服务器在服务器上新建nmon文件夹将下载文件上传到服务器新建的文件夹内修改文件名启动nmon启动nmon命令行使用nomn_analyser对监控结果进行分析图表分析nmon 主要用来做性能测试时对服务器的监控 捕捉各类系统资源的使用情况&#xff0c;并…