Acwing DFS

DFS:深度优先搜索

  • DFS与BFS的对比

    • DFS使用栈来实现,BFS使用队列来实现
    • DFS所需要的空间是 O ( h ) O(h) O(h),而BFS需要的空间是 O ( 2 h ) O(2^h) O(2h),其中h是树的高度;
    • DFS不具有最短路的特性,BFS有最短路的特性

DFS回溯的时候,一定要记得恢复现场

经典问题:全排列问题、n皇后问题

Acwing 842.排列数字
在这里插入图片描述
输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

思路1:直接使用 C++标准库里面的next_permutation() 函数生成数组的下一个排列,直到所有排列生成完成。
具体代码:

#include <iostream>
#include <algorithm>
using namespace std;int main() {int n;cin >> n;  // 输入 n// 初始化数组,从 1 到 nint num[n];for (int i = 0; i < n; i++) {num[i] = i + 1;}// 按照字典序输出所有排列do {for (int i = 0; i < n; i++) {cout << num[i] << " ";}cout << endl;} while (next_permutation(num, num + n));  // 使用 next_permutation 生成下一个排列return 0;
}

但此题还是要以练习DFS为主。
思路2:使用深度优先搜索,n = 3的图示如下:
在这里插入图片描述

  • 每次搜索确实一个位置的数字,然后回溯判断是否有其它可能,回溯后要恢复现场(st[i] = false);
  • 设置一个结果数组path[,存储每次确定放置的数字。dfs递归参数设置为u,表示要判断的第几个数字,若u=n表示找到一个序列输出,然后回溯(注意u从0开始,u=n时就意味着放置好了n个数)
    • 设置一个bool数组st[],st[i] = true表示数字i已经放置,否则未放置;
    • 若未放置,则将i放在当前位置path[u],且设置st[i] = true;
    • 然后递归到下一个位置dfs(u+1),继续判断放置
    • 到达最后一个位置输出一次结果后,回溯,恢复现场,设置st[i] = false,然后继续循环判断这个位置放另一个数;

具体代码(详解版)

#include <iostream>  
#include <algorithm>  using namespace std;  const int N = 10;int n;
int path[N];//path存储结果(从0开始)
bool st[N];//st表示当前数字是否已经使用(放置)(从1开始)初始化默认为false//深度优先搜素
void dfs(int u){if(u == n){//u表示当前处理第几个数,u=n时已经处理n个for(int i = 0;i < n; i ++) cout << path[i] << ' ';cout << endl;return;}//否则继续搜索for(int i = 1; i <= n; i ++){if(!st[i]){//当前数字未被使用path[u] = i;//使用st[i] = true;dfs(u+1);//递归到下一个st[i] = false;//回溯后要恢复现场}}
}int main(){cin >> n;dfs(0);//从0开始return 0;
}

Acwing 843. n-皇后问题
在这里插入图片描述
输入样例:

4

输出样例:

.Q…
…Q
Q…
…Q.
…Q.
Q…
…Q
.Q…

思路分析:按行(u)枚举,dfs(u)

  • 确定n个位置,每次需要回溯和剪枝(即发现条件不符合时直接跳过这种情形,而不是把这种情况完成在进行排除,从而减少了时间复杂度操作;
  • 条件判断包括行、列、主对角线、副对角线。u表示目前放置第几个皇后,也表示第几行。列用i作为循环条件,每次确定一行中某个(u,i)放置皇后
    • 对于行:由于每行只有一个皇后,要放置n个皇后,每次递归处理一行,放置一个皇后,u=n时,结束表示放置完毕,即行为隐藏编号,无需额外的行数组;
    • 对于列:设置一个列数组col[],bool型,col[i]为true时表示当前列i已有皇后;
    • 对于主对角线:同样设置一个bool数组dg[],dg[u+i]为true时表示当前位置的主对角线方向有皇后;
    • 对于副对角线:设置一个bool数组udg[],udg[i-u+n]为true时表示当前位置的副对角线方向有皇后;

关于为什么是u+ii-u+n:如果将棋盘类比成平面直角坐标系,左上角的点就是坐标原点O。可以把u看作横坐标,i看作纵坐标,若主对角线v1是不通过O的,那么v1上的点的横纵坐标之和不变,即u+i不变,副对角线v2上的点的横纵坐标之差不变即i-u不变,但是i-u可能会小于0(最小为0-8==-8),由于数组下标的限制,所以要对i-u加8。这样确保编号是正数,并且每条副对角线有唯一的编号,适合在数组中进行索引。(如下图)
在这里插入图片描述

  • 注意每次回溯前,即放置皇后后,要设置当前列、主对角、副对角为true;回溯后要设置当前列、主对角、副对角为false(即回到当前位置要恢复现场)

具体代码实现(详解版):

#include <iostream>using namespace std;const int N = 20;int n;
char g[N][N]; // 用于存储棋盘
bool col[N], dg[N], udg[N]; // 列标记,主对角线标记,副对角线标记// 深度优先搜索函数
void dfs(int u) { // u 表示当前处理的行,从0开始,表示第一行if (u == n) { // 当 u == n 时,表示所有行都已经放置了皇后for (int i = 0; i < n; i++) puts(g[i]); // 输出当前棋盘,puts直接按行输出puts(""); // 输出空行return;}// 继续处理当前行的每一列for (int i = 0; i < n; i++) { // 遍历每一列if (!col[i] && !dg[u + i] && !udg[n - u + i]) { // 如果当前列、主对角线、副对角线都没有皇后g[u][i] = 'Q'; // 在当前格子放置皇后col[i] = dg[u + i] = udg[n - u + i] = true; // 更新列和对角线标记dfs(u + 1); // 递归处理下一行col[i] = dg[u + i] = udg[n - u + i] = false; // 回溯,恢复标记g[u][i] = '.'; // 移除皇后,恢复棋盘}}
}int main() {cin >> n; // 输入棋盘大小 n// 初始化棋盘,每个格子为空for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {g[i][j] = '.';}}dfs(0); // 从0开始,表示第一行return 0;
}

总结:DFS 是一种强大且灵活的搜索算法,广泛应用于图搜索、树遍历、回溯法等问题中。通过深入每条可能路径来探索解,DFS 可以高效解决很多组合类问题。
DFS 通常通过递归实现,伪代码如下:

void dfs(节点 u) {if (u 是目标节点) {处理当前节点的结果;return;}for (每个与 u 相邻的节点 v) {if (v 未访问) {标记 v 为已访问;继续从 v 进行深度优先搜索;回溯后恢复 v 的状态; // 如果需要继续探索其他路径}}
}

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

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

相关文章

102.SAPUI5 sap.ndc.BarcodeScannerButton调用摄像头时,localhost访问正常,使用IP访问失败

目录 原因 解决办法 1.修改谷歌浏览器的setting 2.在tomcat中配置https访问 参考 使用SAPUI5的sap.ndc.BarcodeScannerButton调用摄像头时&#xff0c;localhost访问正常&#xff0c;使用IP访问时&#xff0c;一直打不开摄像头&#xff0c;提示getUserMedia()问题。 原因…

2024 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|大数据驱动的地理综合问题|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…

elasticsearch同步mysql方案

文章目录 1、1. 使用数据库触发器2. 使用定时任务3. 监听MySQL二进制日志&#xff08;binlog&#xff09;4. 使用数据管道5. 使用第三方工具或服务6. 编写自定义脚本注意事项 2、1. 使用Logstash步骤&#xff1a;示例配置&#xff1a; 2. 使用Debezium步骤&#xff1a; 3. 自定…

828华为云征文 | 解锁企业级邮件服务,在华为云fFlexus x实例上部署Mailcow开源方案

前言 华为云Flexus X实例携手Mailcow开源邮件方案&#xff0c;为企业打造了一个既高效又安全的邮件服务解决方案。Flexus X实例的柔性算力与高性能&#xff0c;是这一方案的坚实基石。它提供CPU内存的灵活定义&#xff0c;以经济型价格实现旗舰级性能&#xff0c;确保邮件服务的…

云计算课程作业1

作业1 Xmanager连接 rhel连接 作业2 首先确认你的虚拟机设置的是NAT 1-3 然后打开这篇blog&#xff0c;并完成第一步和第二步 因为我们是NAT&#xff0c;所以不需要连接网桥&#xff0c;即跳过第三步&#xff0c;但是这里ping一下测试网络连接 2- 如果到这里你发现提示yum…

Stylized Smooth Clouds 卡通风格化云朵包

下载:​​Unity资源商店链接资源下载链接 效果图:

828华为云征文|Flexus X实例Docker+Jenkins+gitee实现CI/CD自动化部署-解放你的双手~

目录 前言 实验步骤 环境准备 安装Portainer 拉取镜像 更换镜像源 启动容器 安装jenkins 拉取镜像 获取管理员密码 新建流水线项目 Portainer配置 gitee配置WebHooks 构建 修改代码&#xff0c;自动部署 前言 &#x1f680; 828 B2B企业节特惠来袭&#xff0c;…

如何通过蜂巢(容器安全)管理内部部署数据安全产品与云数据安全产品?

本文将探讨内部部署和云数据安全产品之间的主要区别。在思考这个问题之前&#xff0c;首先了解内部部署和云数据安全产品之间的主要区别。 内部部署数据安全产品意味着管理控制台位于企业客户的内部部署&#xff0c;而德迅云安全则在云中托管云数据安全产品。德迅云安全供应商通…

gin集成jaeger中间件实现链路追踪

1. 背景 新业务线带来新项目启动&#xff0c;需要改进原有项目的基础框架和组件能力&#xff0c;以提升后续开发和维护效率。项目搭建主要包括技术选型、框架搭建、基础服务搭建等。这其中就涉及到链路追踪的内容&#xff0c;结合其中的踩坑情况&#xff0c;用一篇文章来说明完…

【第十三章:Sentosa_DSML社区版-机器学习聚类】

目录 【第十三章&#xff1a;Sentosa_DSML社区版-机器学习聚类】 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章&#xff1a;Sentosa_DSML社…

54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)

和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数 8.strncpy函数 *简单使用 cplusplus的介绍 点我跳转 翻译: 函数 strncpy char * strncpy ( char * destination, const char * source, size_t num ); 从字符串中复制一些字符 复制源(source)字符串的前num个…

MySQL高阶1890-2020年最后一次登录

目录 题目 准备数据 分析数据 题目 编写解决方案以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。 返回的结果集可以按 任意顺序 排列。 准备数据 Create table If Not Exists Logins (user_id int, time_stamp …

JavaSE--集合总览02:单列集合Collection的体系之一:List

Collection体系的特点 分为 list 和set集合&#xff0c;这篇文章主要讲述List&#xff0c;下篇讲述Set。 简单认识单列集合collection集合的特点 : list集合的特点&#xff1a; 有序 可重复 有索引 set集合的特点&#xff1a;无序 不重复 无索引 其中LinkedHashSet有序 TreeS…

【delphi】正则判断windows完整合法文件名,包括路径

在 Delphi 中&#xff0c;可以使用正则表达式来检查 Windows 文件名称或路径是否合法。合法的文件名和路径要求符合以下几点&#xff1a; 禁止的字符&#xff1a;文件名和路径不能包含以下字符&#xff1a;<, >, :, ", /, \, |, ?, *。文件名不能以空格或点结束。…

关于Spring Cloud Gateway中 Filters的理解

Spring Cloud Gateway中 Filters的理解 Filters Filters拦截器的作用是&#xff0c;对请求进行处理 可以进行流量染色 ⭐增加请求头 例子 spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://localhost:8123predicates:- Path/api/**filters:- AddR…

【图像压缩与重构】基于标准+改进BP神经网络

课题名称&#xff1a;基于标准改进BP神经网络的图像压缩与重构&#xff08;带GUI) 代码获取方式(付费&#xff09;&#xff1a; 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a; 1. 基于标准BP神经网络的图…

windows下,用docker部署xinference,为什么老是提示localhost无法访问?

部署xinference有两种方式&#xff1a; 一、本地部署 &#xff08;略&#xff09; 二、使用Docker部署&#xff08;与运行&#xff09; 其中又包括&#xff1a; 1&#xff09;使用CPU的方式&#xff1a;&#xff08;略&#xff09; 1&#xff09;使用GPU的方式&#xff1…

计算机的错误计算(九十九)

摘要 讨论 的计算精度问题。 计算机的错误计算&#xff08;五十五&#xff09;、&#xff08;七十八&#xff09;以及&#xff08;九十六&#xff09;分别列出了 IEEE 754-2019[1]中的一些函数与运算。下面再截图给出其另外几个运算。 另外&#xff0c;计算机的错误计算&…

电气设备施工现场风险状态判断ai模型训练数据集

电气设备施工现场风险状态判断ai模型训练数据集 id:18 电气设备施工现场工人人工智能学习数据和工作环境安全数据&#xff0c;建立系统化管理体系&#xff0c;改变全球EHS范式&#xff0c;预防工业事故。数据集记录了387709例子电力设施建设以及施工现场相关的灾害安全环境数据…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义&#xff0c;如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…