跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

DFS 算法简介

DFS 深度优先搜索是一种利用递归实现枚举的搜索方法,通过分层细化问题并在终止条件满足时回溯。其核心框架包含当前状态、递归边界和初始状态三部分。以正整数分解为例,展示了如何设计 DFS 函数状态(剩余数字、上一数字、已分个数)及处理逻辑,适用于解决组合枚举类问题。

莫名其妙发布于 2026/3/25更新于 2026/9/976 浏览

引入

在日常 C++ 编程中,常会遇到 DFS(深度优先搜索)这一概念。本文介绍其定义、特点及实现方法。

定义

DFS(Depth First Search),即深度优先搜索,是一种利用计算机运行速度优势解决需要枚举较多情况问题的搜索方法。

算法特点

DFS 利用递归实现枚举,将问题逐步分层细化。在问题足够小时解决(终止条件),并将答案返回(回溯),类似分治思想。

算法实现

使用 DFS 时通常定义一个 dfs() 函数,包含参数如递归深度、当前状态等。完整 DFS 需具备以下三部分:

  1. 当前状态
  2. 递归边界
  3. 初始状态

例题

题目

将正整数 n 分解为 m 个正整数,排在后面的数必须大于等于前面的数,输出所有方案。 若不使用 DFS,可使用多重循环,但当 m 不确定时难以确定循环层数,此时 DFS 更为适用。

题目分析

定义 dfs 函数所需状态:

  • 剩余可用的数字大小
  • 前一个数字的大小(保证后一个数 >= 前一个数)
  • 已分出的数字个数

函数签名建议:dfs(剩余可用数字,上一个数字大小,已分出数字个数)

初始状态设计
  • 剩余可用数字:n
  • 上一个数字:0
  • 已分出数字个数:0
状态处理

记当前可分配数字大小为 L,上一个数字为 x,已分出个数为 d,当前选择数字为 cnt,答案数为 ans。 cnt 从 x 开始遍历。若 cnt > L,则后续必然超过,直接返回。若 cnt <= L,继续下一位:L 变为 L-cnt,d 变为 d+1,x 变为 cnt。

核心逻辑流程:

对于 dfs(L, x, d):
  当 d = n 时:
    如果满足条件(L=0): 处理答案 (ans++)
    如果不满足条件(L!=0): return
  当 d != n 时:
    遍历每一种可能的结果 (cnt)
    如果可行:接着往下处理 dfs(L-cnt, cnt, d+1)
    如果不可行:return

对于 main() 函数:输入数据,开始 dfs(n, 0, 0)。

核心流程概括

DFS 核心框架包含三个部分:

  1. 递归边界(Base Case)
  2. 递归处理答案(Recursive Step)
  3. 初始状态(Initial Call)

针对不同题目需设计不同的状态并处理。

作业

  • 全排列问题
  • 选数

目录

  1. 引入
  2. 定义
  3. 算法特点
  4. 算法实现
  5. 例题
  6. 题目
  7. 题目分析
  8. 初始状态设计
  9. 状态处理
  10. 核心流程概括
  11. 作业

更多推荐文章

查看全部
  • 语义化 AI 驱动器:提示词工程的技术演进与未来展望
  • 二分算法实战:查找元素首尾位置与区间查询
  • Python 数据分析入门:集中趋势与离散程度
  • C++ 二分查找算法模板及例题详解
  • Linux C/C++组件编译全解析:从源码到可执行文件
  • 大模型微调框架 Firefly 与 LLaMA Factory 对比及选型建议
  • AI 普及时代,靠什么脱颖而出?
  • 吴恩达:智能体研究日趋成熟,模型优化迎来新方向
  • C++ 运算符重载:自定义类型的运算扩展
  • Windows 11 部署 Langchain-Chatchat 本地知识库指南
  • Docker 重新打包 MySQL5.7 镜像并定制配置
  • Kubernetes 与云原生开发:.NET Core 和 Java 的对比与实践
  • Docker 安装并启动 MySQL 实战指南
  • 用 Deforum 给 Stable Diffusion 加个动画引擎,几步生成视频
  • MixAIHub 镜像站:支持 ChatGPT、Claude 等主流 AI 模型访问
  • Python 爬虫基础知识与 Requests 库使用指南
  • 金仓 SQL 防火墙:构建数据库主动防御体系的实践
  • Trae 辅助 Java 开发:AI 驱动的高效实践指南
  • MCP 协议实战:Browser Tools 插件集成指南
  • Radiomaster Pocket 遥控器资料及 Liftoff 模拟器使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online