深度优先算法(2)——例题详解
2.2 DFS例题详解本章将对于DFS的例题进行讲解讲清楚DFS的用途。代码仓库链接2.2.0 题目清单序号题号题目名称题型分类难度定位核心考点1B3621枚举元组回溯-基础框架入门多层递归、字典序枚举2B3622枚举子集回溯-指数枚举入门选/不选模型、指数型枚举3P1706全排列问题回溯-排列枚举普及-排列型枚举、vis 标记、回溯恢复现场4P1605迷宫回溯-约束枚举普及-标记回溯、递归深入5P1036选数回溯-组合枚举普及-组合枚举、素数判断、可行性剪枝6P1088火星人回溯-排列生成普及-字典序搜索、排列生成、剪枝7P1149火柴棒等式回溯-剪枝普及-指数型枚举、可行性剪枝8P1025数的划分回溯-组合方案提高-整数拆分、去重回溯9B3625迷宫寻路网格 DFS普及-方向数组、访问标记、网格 DFS 模板10P1605迷宫网格 DFS-路径计数普及-障碍规避、路径回溯11P1644跳马问题网格 DFS-剪枝普及-棋盘 DFS、状态空间剪枝12P1219八皇后回溯-强约束普及/提高-行列对角线约束、经典剪枝13P1451求细胞数量FloodFill-连通块普及-4 连通块统计、染色14P1596Lake Counting SFloodFill-连通块普及-8 连通块、水塘计数15P1331海战FloodFill-图形校验普及-矩形连通块校验、合法图形判断16P1506拯救 oibh 总部FloodFill-封闭区域普及-边界连通块剔除、内部封闭区域17P1019单词接龙回溯-字符串搜索提高-字符串重叠处理、DFS 剪枝18P5194Scales回溯-最优性剪枝提高-子集和枚举、最优性剪枝19P3956棋盘回溯-综合普及/提高状态设计、DFS 综合20P1074靶形数独回溯-搜索集大成提高多维度冲突检测、剪枝优化2.2.1 B3621 枚举元组题意简述给定n , k n,kn,k输出所有满足组内元素∈ [ 1 , k ] \in [1,k]∈[1,k]的n nn元组其中n nn元组意为有n nn个不同元素的数列注意不是集合数列有顺序算法分析首先让我们观察样例样例是一个2元组第一个元素依次从1 11到k kk固定第一个元素的情况下第二个元素也依次从1 11到k kk但是不与第一个元素重合由此可以写出当k 2 k2k2时的代码_for(i,n){_for(j,n){if(ij)continue;couti jendl;}}当k 3 k3k3时与这段代码类似但是有3 33层循环k 4 , 5 k4,5k4,5的时候显然也一样。既然这样为了缩短代码虽然感人的数据范围告诉我们k ≤ 4 k\le 4k≤4我们得找到一种控制循环层数的办法。这种方法就是递归具体方法就是将循环体变成函数调用循环层数变成递归层数。相信编程功底扎实的读者知道我在说什么。voidfun(args){if(结束条件)return;for(...){fun();}}通过这样就可以实现任意层数的递归。从定义上这道题也属于DFS递归回溯不过不是最经典的用法但也用到了递归思想。代码位置2\problems\B3621.cpp#includebits/stdc.husingnamespacestd;intn,k;inta[6];// n最大5开6足够voiddfs(intdepth){// 递归终点已经填完n个位置直接输出if(depthn){for(inti0;in;i){couta[i] ;}coutendl;return;}// 当前位置枚举 1~k 所有数可重复选不用visfor(intnum1;numk;num){a[depth]num;dfs(depth1);// 填下一位}}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cinnk;dfs(0);return0;}2.2.2 B3622 枚举子集题意简述有n nn名同学可以选择任意名同学参加合唱输出所有可能性YYES,NNO算法实现这道题有两种思路状压DP、DFS这里简单介绍一下状压DP用一个n nn位二进制数表示集合s ss的子集其中第i ii位如果为1 11则表示取该位为0 00则表示不取。这种算法会在之后讲到代码位于2\problems\P3622_1.cpp下面是正解DFS也是这道题算法标签的算法首先按照全部N到底当N的数量等于n nn的时候就回溯把最底下的N变成Y再来一次代码非常简单。代码位置2\problems\B3622_2.cpp#includebits/stdc.husingnamespacestd;typedeflonglongll;#define_for(i,n)for(inti0;in;i)#define_rep(i,a,b)for(intia;ib;i)#defineendl\nintn;boola[10];voiddfs(intdepth){if(depthn){_for(i,n)cout(a[i]?Y:N);coutendl;return;}a[depth]0;dfs(depth1);a[depth]1;dfs(depth1);}intmain(){ios::sync_with_stdio(0);cin.tie(0);cinn;dfs(0);}前两道例题是DFS最基础的用法只有递归回溯但是这显然不是DFS最常用的用法太简单了实际上深度优先搜索的算法最典型的用法是下面的几道例题。2.2.3 P1706 全排列问题题意简述给出一个值n nn要求输出1 − n 1-n1−n的所有全排列按照字典序顺序算法分析这道题有两种思路使用STL和使用DFS。其中使用STL就没什么必要学习了详见2\problems\P1706_1.cpp使用DFS思考一下我们生成全排列的过程以5个数字全排列为例先从1 11开始还有剩余数字那就往后添加2 22一直到最后得到序列1 , 2 , 3 , 4 , 5 1,2,3,4,51,2,3,4,5。到了5 55之后没有其他数字了就进行回溯得出倒数第二个数字还能用5 55得到序列1 , 2 , 3 , 5 , 4 1,2,3,5,41,2,3,5,4。倒数第二个数字也没有其他情况了继续回溯得到序列1 , 2 , 4 , 3 , 5 1,2,4,3,51,2,4,3,5以此类推得到全部全排列发现符合DFS一条路走到黑的特点每一个位置都能使用前面位置未使用过的数字哪些数字用过使用vis数组记录visa的缩写DFS的算法还是重在熟练。代码位置2\problems\P1706_2.cpp#includebits/stdc.husingnamespacestd;typedeflonglongll;#define_for(i,n)for(inti0;in;i)#define_rep(i,a,b)for(intia;ib;i)#defineendl\nboolvis[10];// 数据范围比较小也不用考虑用vectorbool状态压缩inta[10];intn;// dfs函数要用就设为全局voiddfs(intdepth){_for(i,n){if(!vis[i]){if(depthn){// 递归到底输出a[depth-1]i1;_for(i,n)coutsetw(5)a[i];coutendl;return;}vis[i]true;a[depth-1]i1;dfs(depth1);vis[i]false;}}}intmain(){ios::sync_with_stdio(0);cin.tie(0);cinn;dfs(1);return0;}2.2.4 P1605 迷宫题意简述给出一个迷宫其中有n nn个障碍物给出这些障碍物的坐标( x , y ) (x,y)(x,y)并给出起点坐标( s x , s y ) (sx,sy)(sx,sy)和终点坐标( f x , f y ) (fx,fy)(fx,fy)问从起点走到终点并不经过障碍物有多少种方法算法分析这道题是一道迷宫的问题可以使用DFS算法解决我们先想一想用人脑如何比较公式化地用DFS思维解这道题从起点出发只要能向下走就向下走当然也可以选择其他方向如果不能向下走就考虑向左向右向上走当走到终点了就增加答案数量当走进死胡同就回到上一个岔路口重新选择这是一道经典的DFS模板题要熟记代码灵活转化代码位置2\problems\P1605.cpp#includebits/stdc.husingnamespacestd;typedeflonglongll;#define_for(i,n)for(inti0;in;i)#define_rep(i,a,b)for(intia;ib;i)#defineendl\nintsx,sy,fx,fy;intn,m,t;boolmatrix[5][5];boolvis[5][5];intdx[]{1,0,-1,0};// 方向数组intdy[]{0,1,0,-1};intdfs(intx,inty){if(xfxyfy)return1;// 到终点了intcnt0;_for(i,4){// 越界检查if((xdx[i]0)||(ydy[i]0))continue;if((xdx[i]n)||(ydy[i]m))continue;if(!matrix[xdx[i]][ydy[i]](!vis[xdx[i]][ydy[i]])){vis[xdx[i]][ydy[i]]true;// 添加标记cntdfs(xdx[i],ydy[i]);vis[xdx[i]][ydy[i]]false;// 撤销标记}}returncnt;// 既然没有到达终点的可能已经排除了那么遇到死胡同直接返回0即可无需判断}intmain(){ios::sync_with_stdio(0);cin.tie(0);cinnmt;cinsxsyfxfy;sx--;sy--;fx--;fy--;vis[sx][sy]true;// 先给起点打上标记while(t--){intx,y;cinxy;x--;y--;matrix[x][y]true;}coutdfs(sx,sy)endl;}剩下的题目建议自主完成以熟练掌握DFS算法的应用

相关新闻

计算机网络核心考点精讲:TCP/IP、GBN协议与IP分片实战解析

计算机网络核心考点精讲:TCP/IP、GBN协议与IP分片实战解析

1. 项目概述:一份面向实战的计算机网络核心知识手册 如果你正在为计算机网络的期末考试、考研复试、保研面试或者求职笔试而焦头烂额,面对海量的名词解释和简答题不知从何下手,那么这份汇总正是为你准备的。我经历过无数次类似的备考&#xf…

2026/8/16 22:14:44 阅读更多 →
【数据库】索引

【数据库】索引

第七章 数据库索引 文章目录第七章 数据库索引前言一、B树与B树二、页三、索引分类1.主键索引2.普通索引3.唯一索引4.全文索引5.聚集索引6.非聚集索引7.索引覆盖四、创建普通索引五、查看索引六、删除索引七、提问总结前言 索引相当于是个目录 , 加快查询数据 代价 : 消耗额外…

2026/8/16 22:13:44 阅读更多 →
C 到 C++ 丝滑过渡教程(入门基础篇)

C 到 C++ 丝滑过渡教程(入门基础篇)

📑 目录 - 一、namespace) 1.1 namespace的价值1.2 namespace的定义1.3 命名空间的使用二、C输入&输出三、缺省参数四、函数重载五、引用 5.1 引用的特性5.2 引用的使用5.3 指针与引用的关系 六、const引用七、inline八、nullptr 一、namespace ### 1.1 name…

2026/8/16 22:13:44 阅读更多 →

最新新闻

大语言模型监督微调(SFT)实战:从原理到应用,打造专属AI助手

大语言模型监督微调(SFT)实战:从原理到应用,打造专属AI助手

1. 从“续写大师”到“听话助手”:SFT监督微调的本质 如果你玩过早期的大语言模型,比如GPT-2,或者一些开源的基座模型,你可能会有一个困惑:它好像什么都懂一点,天文地理、历史文学都能跟你聊上几句&#xf…

2026/8/16 22:55:26 阅读更多 →
工业 HMI 进化论:从 “傻白甜” 到 “智慧大脑” 的三级跳

工业 HMI 进化论:从 “傻白甜” 到 “智慧大脑” 的三级跳

还以为 HMI 就是车间里那块显示数据的屏幕?out 啦!工业 4.0 浪潮下,这货早就不是 “人机交互界面” 那么简单,摇身一变成了连接物理工厂和数字世界的超级节点。想知道未来的 HMI 有多酷?这三大趋势带你提前剧透&#x…

2026/8/16 22:55:26 阅读更多 →
Java全栈面试宝典:从P6到P8-8

Java全栈面试宝典:从P6到P8-8

第8章 网络编程(80题) 网络编程是服务端开发的底层功。我面试的时候发现一个规律:能把TCP三次握手讲清楚的候选人,项目经验通常也不差;连TIME_WAIT都不知道的,大概率没在生产环境排查过线上问题。这80题从网络基础到Netty到Tomcat再到实战设计,覆盖了Java后端面试中几乎…

2026/8/16 22:55:26 阅读更多 →
FDE系列12:PoC的正确姿势——用最小代价验证最危险的假设

FDE系列12:PoC的正确姿势——用最小代价验证最危险的假设

FDE系列12:PoC的正确姿势——用最小代价验证最危险的假设本文是《FDE工程师-从AI技术实现到业务落地》系列文章第12篇“客户说先做个PoC验证一下。” 这句话,可能是FDE工作中最容易被误解的一句话。大多数人对PoC的理解是错的 大多数技术人理解的PoC&…

2026/8/16 22:54:26 阅读更多 →
LLM驱动CAD智能绘图:四种技术路线深度解析与工程实践

LLM驱动CAD智能绘图:四种技术路线深度解析与工程实践

1. 从“对话”到“绘图”:当LLM试图理解CAD最近几个月,我身边搞机械设计、建筑制图的朋友,还有几个做AI应用开发的老同事,都在讨论同一个话题:能不能让大语言模型(LLM)直接去操作CAD软件&#x…

2026/8/16 22:54:26 阅读更多 →
AIGC+PlantUML:用自然语言生成技术图表,重构高效文档工作流

AIGC+PlantUML:用自然语言生成技术图表,重构高效文档工作流

1. 项目概述:当AIGC遇上PlantUML,画图这件事彻底变了作为一名在技术文档和架构设计领域摸爬滚打了十多年的老手,我画过的图比我写过的代码行数可能还要多。从最初用Visio拖拽,到后来用各种在线工具,再到沉迷于代码画图…

2026/8/16 22:54:26 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →