C++知识点总结(36):深度优先搜索算法

DFS

  • 一、概念
  • 二、典型题目
    • 1. 题目
    • 2. 分析
    • 3. 参考答案
  • 三、变形题目
    • 1. 路径数量
      • 1.1 审题
      • 1.2 思路
    • 2. 走迷宫的过程
      • 2.1 审题
      • 2.2 参考答案

一、概念

深度优先搜索(简称 DFS),其工作原理为不撞南墙不回头,能深则深,不能则退。最差情况下的时间复杂度为 O ( a n ) O(a^n) O(an) a a a 为可选条数。

二、典型题目

1. 题目

给定一个 n n n m m m 列的迷宫,有些格子可以走,有些有障碍物不能到达。每步可以走到上下左右的格子中。请你判断,是否能从左上角走到右下角。如果能走到输出 YES,否则输出 NO。迷宫中字符为 * 表示迷宫这个格子有障碍物,. 表示没有障碍物。

2. 分析

不能走的地方

  • 迷宫的边界
  • 遇到障碍物
  • 走回头路

DFS 的功能

在一个点遍历 4 4 4 个方向,如果这个方向上的点满足条件,去下一个点。

伪代码

dfs(x, y)if (x == n && y == m)stopif (isRoad(a[?][?]))dfs(?, ?);...

3. 参考答案

#include <iostream>
using namespace std;int n, m; // 迷宫大小
bool flag; // 是否有解 
char Map[25][25]; // 地形图
bool vis[25][25]; // 标记是否走过 
int dx[5] = {-1, 0, 1, 0}; // 四个方向的偏移量 
int dy[5] = {0, 1, 0, -1}; // 四个方向的偏移量 void dfs(int x, int y)
{// 到终点 if (x == n && y == m){flag = true;return;}// 遍历方向,判断是否满足条件for (int i = 0; i < 4; i++){int tmpX = x + dx[i];int tmpY = y + dy[i];// 是通路if (Map[tmpX][tmpY] == '.'){// 未到边界if (tmpX >= 1 && tmpX <= n && tmpY >= 1 && tmpY <= m) {// 未访问if (vis[tmpX][tmpY] == false) {vis[tmpX][tmpY] = true;dfs(tmpX, tmpY);}}}}
}int main()
{// 输入cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> Map[i][j];}}// dfsvis[1][1] = 1;dfs(1, 1);// 输出cout << (flag ? "YES" : "NO");return 0;
}

三、变形题目

1. 路径数量

1.1 审题

给定一个 n n n m m m 列的矩阵,可以向上下左右四个方向移动,找到能从 ( s x , s y ) (sx, sy) (sx,sy) 走到 ( e x , e y ) (ex, ey) (ex,ey) 的所有路径数。

1.2 思路

这个题目和典型题目非常类似,只是多了回溯 ( 1 ) ^{(1)} (1)的步骤。

回溯
通过逐步试探和撤销的方式来查找问题的解,这种算法就叫回溯法。
优点:

  • 简单直观
  • 适用于穷举搜索
  • 可以找到所有的解

缺点:

  • 效率低
  • 难以优化
  • 可能重复计算

2. 走迷宫的过程

2.1 审题

给定一个 n n n m m m 列的迷宫,有些格子可以走,有些有障碍物不能到达。每步可以走到上下左右的 4 4 4 个格子中。请你输出从左上角开始,走到右下角的路径。其中,从一个格子出发,优先出发的顺序为:上、右、下、左。输出的路径坐标之间使用空格隔开,由于路径可能有多条,每条路径之间使用换行隔开。

2.2 参考答案

#include <iostream>
using namespace std;int n, m; // 迷宫大小
char Map[25][25]; // 地形图
bool vis[25][25]; // 标记是否走过 
int dx[5] = {-1, 0, 1, 0}; // 四个方向的偏移量 
int dy[5] = {0, 1, 0, -1}; // 四个方向的偏移量
int pos = 1; // 路线的长度
int ansx[85] = {1}; // 路线的 x 坐标
int ansy[85] = {1}; // 路线的 y 坐标void dfs(int x, int y)
{// 到终点 if (x == n && y == m){for (int i = 0; i <= pos-1; i++){cout << "(" << ansx[i] << "," << ansy[i] << ") ";}cout << endl;return;}// 遍历方向,判断是否满足条件for (int i = 0; i < 4; i++){int tmpX = x + dx[i];int tmpY = y + dy[i];// 是通路if (Map[tmpX][tmpY] == '.'){// 未到边界if (tmpX >= 1 && tmpX <= n && tmpY >= 1 && tmpY <= m) {// 未访问if (vis[tmpX][tmpY] == false) {// 标记已经走过vis[tmpX][tmpY] = true;// 存储路线ansx[pos] = tmpX;ansy[pos] = tmpY;pos++;// 递归dfs(tmpX, tmpY);// 回溯vis[tmpX][tmpY] = false;pos--;}}}}
}int main()
{// 输入cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> Map[i][j];}}// dfsvis[1][1] = true;dfs(1, 1);return 0;
}

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

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

相关文章

Element-UI入门

目录 1.什么是Element-UI 2.作用 3.版本历史 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.代码示例 7.未来展望 8.总结 1.什么是Element-UI Element-UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。提供了一整套 UI 组件&#xff0c;使开发者能够快速构…

一步一学!如何通过SOLIDWORKS曲面放样绘制花瓶?

SOLIDWORKS中&#xff0c;我们对放样凸台的操作已经非常熟悉。现在&#xff0c;我们将进一步探索曲面菜单栏中的放样成型功能。 1、绘制草图 首先&#xff0c;同普通放样凸台建模相同&#xff0c;绘制放样轮廓及引导线段。 可通过创建基准面布置轮廓&#xff0c;利用穿透选项将…

AVL许可安全性问题

在数字化时代&#xff0c;软件已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着软件应用的广泛普及&#xff0c;安全性问题也日益凸显。如何保障软件使用安全&#xff0c;防止潜在风险&#xff0c;成为了我们必须关注的重要议题。AVL许可作为软件管理的重要组成…

144、二叉树的前序递归遍历

题解&#xff1a; 递归书写三要素&#xff1a; 1&#xff09;确定递归函数的参数和返回值。要确定每次递归所要用到的参数以及需要返回的值 2&#xff09;确定终止条件。操作系统也是用栈的方式实现递归&#xff0c;那么如果不写终止条件或者终止条件写的不对&#xff0c;都…

Android 各个版本名称和特性总结(持续更新)

我们就从Android 5.0开始吧&#xff0c;因为从写文时起&#xff0c;大部分手机都到5.0了。 目录 Android5.0 &#xff08;Lollipop 棒棒糖&#xff09;新特性 Android6.0新特性 Android7.0新特性 Android8.0(O)新特性 Android9.0新特性 Android10.0(Q)新特性 Android11…

定位器追踪器怎么连接手机

定位器追踪器连接手机的方法主要取决于追踪器的类型和功能。下面将列举一些常见的方式来说明如何将定位器追踪器与手机连接&#xff1a; 蓝牙连接 检查设备兼容性&#xff1a;确保你的定位器追踪器支持蓝牙功能&#xff0c;同时手机的蓝牙也已开启。进行配对&#xff1a;在手机…

前端调用接口有参数正常显示返回值,但是打印是undefined

前端调用接口有参数正常显示返回值&#xff0c;但是打印是undefined 这种有几种情况&#xff0c;但总的来说是因为我们做了接口拦截器的处理 一、后端返回code值有误 比如新来的后端忘记传code了。&#xff08;按照公司规范&#xff0c;一般都是200成功码&#xff09; 或者网上…

java程序100道21-30

21.定义一个接口A&#xff0c;有一个String的常量值为Java的 s&#xff0c;有void 的print()方法和String 的getInfo()方法&#xff0c;类X是A的实现类&#xff0c;类A的print()方法输出常量s,方法getInfo()返回“Hello!!!” package Exercises.One_Hundred.Demo21; ​ public…

IO-源码阅读 glibc 2.35

文章目录 参考缓存机制IO_FILE_PLUSfopenfopen_internal_IO_no_init_IO_old_init _IO_new_file_init_internal_IO_link_in _IO_new_file_fopen_IO_file_open fread_IO_fread_IO_sgetn_IO_doallocbuf_IO_file_doallocate_IO_file_stat_IO_setb __underflow_IO_new_file_underflo…

[Cloud Networking] Layer 2

文章目录 1. 什么是Mac Address?2. 如何查找MAC地址&#xff1f;3. 二层数据交换4. [Layer 2 Protocol](https://blog.csdn.net/settingsun1225/article/details/139552315) 1. 什么是Mac Address? MAC 地址是计算机的唯一48位硬件编码&#xff0c;嵌入到网卡中。 MAC地址也…

英特尔:AI落地,未来已来

引言 随着AI技术的发展和大模型的普及&#xff0c;人工智能正在逐渐渗透到我们的日常生活中。2023年5月底&#xff0c;我参加了台北的英特尔技术展&#xff0c;深入了解了英特尔在AI个人电脑领域的最新进展。本文将详细介绍英特尔的新一代移动处理器Lunar Lake&#xff0c;以及…

Spring Data Jpa 实现批量插入或更新

1. BatchConsumer package com.demo.common.hibernate.batch;import com.demo.common.hibernate.querydsl.QueryParameterBuilder;/*** 批量数据消费者接口&#xff0c;用于设置 SQL 参数并执行操作。** param <T> 记录类型的泛型* author xm.z*/ FunctionalInterface p…

02 Linux 调试手段

1、printk 与打印等级 在 Linux 内核中,内核开发者喜欢 printk 来调试,它与 C 库的 printf() 函数类似。 printk() 与 printf() 区别:printk() 提供输出等级。内核会根据这个等级来判断是否在终端或者串口中输出 log。 1)printk 等级 #define KERN_EMERG KERN_SOH &quo…

主成分分析学习

8 主成分分析 | 多元统计分析讲义 (pku.edu.cn) 清风数学建模学习笔记——主成分分析(PCA)原理详解及案例分析_x10为生均教育经费对以上指标数据做主成分分析&#xff0c;并提取主成分-CSDN博客 PCA&#xff08;主成分分析&#xff09;-------原理&#xff0c;推导&#xff0…

LabVIEW 与组态软件在自动化系统中的应用比较与选择

LabVIEW 确实在非标单机设备、测试和测量系统中有着广泛的应用&#xff0c;特别是在科研、教育、实验室和小型自动化设备中表现突出。然而&#xff0c;LabVIEW 也具备一定的扩展能力&#xff0c;可以用于更复杂和大型的自动化系统。以下是对 LabVIEW 与组态软件在不同应用场景中…

【C++】——Stack与Queue(含优先队列(详细解读)

前言 之前数据结构中是栈和队列&#xff0c;我们分别用的顺序表和链表去实现的&#xff0c;但是对于这里的栈和队列来说&#xff0c;他们是一种容器&#xff0c;更准确来说是一种容器适配器 ✨什么是容器适配器&#xff1f; 从他们的模板参数可以看出&#xff0c;第二个参数模…

Kafka 架构

1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务&#xff0c;用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈&#xff0c;…

力扣155. 最小栈

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 …

开发指南029-el-table-column对齐属性

按开发文档和正常理解&#xff0c;el-table-column具有属性align&#xff0c;可以填left&#xff0c;center&#xff0c;right控制内容的对齐方式。你真正做的时候&#xff0c;就会发现根本不起作用。 查网络&#xff0c;大部分怀疑你用错属性了&#xff0c;elment-ui版本不对&…

SmartDraw Suite Edition 画图软件画表格内存示意图的使用方法

总述&#xff1a;遇到不会画的&#xff0c;比如如何画一条虚线&#xff0c;先将 虚线 翻译成英文&#xff0c;然后在 help 中查询。 新建的时候选择如下&#xff1a; 一、选择 Forms->Blank Form 二、画表格&#xff1a; 三、画箭头&#xff1a;先选择1在选择2 四、编辑文…