论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
职场与人生
›
IT职场那些事
›
【刷题】备战蓝桥杯 — dfs 算法
【刷题】备战蓝桥杯 — dfs 算法
伤心客
论坛元老
|
2025-4-23 13:46:22
|
显示全部楼层
|
阅读模式
楼主
主题
1818
|
帖子
1818
|
积分
5454
送给大家一句话:
风度真美!
即使流泪,也要鼓掌,
即使失望,也要满怀希望。
——刘宝增
1 前言
在蓝桥杯的角逐中,深度优先搜刮(DFS,Depth-First Search)算法是一种常用的搜刮算法,它通过尽大概深地搜刮树的分支,来探求解决方案。由于其简单和易于实现的特性,DFS成为解决题目的强盛工具,尤其是在数据规模较小的环境下。数据在100以内一般使用dfs
运行原理: DFS算法的核心头脑是从一个起点开始,沿着树的边走到尽大概深的分支上,然后回溯到之前的分叉点,探求未探索的分支。这个过程重复进行,直到找到解决方案或探索完全部大概的路径。DFS通常使用递归实现,这使得代码简洁易读。它利用栈(递归调用栈)来记载访问路径,从而实现回溯功能。根本蓝桥杯dfs算法题型可以使用以下模版:
#include <bits/stdc++.h>
//视情况而定
#define int long long
#define endl '\n'
#define N 1001
using namespace std;
//往往需要一个哈希表来辅助判断
int vis[N] = {
0};
void dfs()
{
//退出条件很重要!!!
if() return ;
for()
{
//跟新结果
//继续深入
dfs();
//回溯
}
}
signed main()
{
//加快读写速度 也可以直接使用C语言标准输入输出函数
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//多组数据
int t = 0; cin >> t;
while(t--)
{
//进行基础读入数据
//构建图 ,记录结构体等
//解决问题
dfs();
}
return 0;
}
复制代码
常用于以下题型:
路径题目: 探求从起点到尽头的路径,或者求解全部大概的路径。
排列组合题目: 须要罗列出全部大概的环境时,如全排列、组合选择。
连通性题目: 如判断图中两个节点是否连通,或者求解连通分量。
解谜与回溯题目: 如N 皇后题目、迷宫探索、数独解题等。
注意事项:
栈溢出题目(一般不消思量): 由于DFS使用递归实现,深度过大时大概会导致栈溢出。针对这一点,可以实行使用迭代深化搜刮(IDS)或非递归方式实现DFS。
重复状态处置惩罚(一定要细致): 在搜刮过程中大概会遇到重复状态,如果不加以处置惩罚,大概会导致算法陷入无限循环。通常使用访问标记(如访问数组)来制止重复访问。
选择符合的剪枝策略(尽力而行): 合理的剪枝可以明显进步DFS的效率。通过预先判断某些路径是否大概到达目标,从而制止无效搜刮。
通过以上的解析,我们可以看到DFS不仅在蓝桥杯中,在许多算法竞赛和实际题目解决中都是一个非常实用的工具。它固然在处置惩罚大数据量时大概会遇到性能瓶颈,但在数据量适中、须要深度搜刮解决方案的题目上,DFS仍然是一个非常可靠的选择。
下面我们来一起做几道竞赛题目来试试手!
2 洛谷 P1030 [NOIP2001 普及组] 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)
输入格式
共两行,均为大写字母构成的字符串,表示一棵二叉树的中序与后序排列。
输特别式
共一行一个字符串,表示一棵二叉树的先序。
根据题目,我们须要通过二叉树的中序遍历和后序遍历来写出前序遍历的结果。对于二叉树的确定单凭中序遍历或者后序遍历是不大概的,只有两者联合才能确定一棵完备的二叉树!来看样例:
输入
BADC
BDCA
输出
ABCD
我们可以画出树的布局:
这样前序遍历的结果就有了
算法思路
这道题涉及了二叉树,那么如果不使用dfs 就会非常复杂捏!以是我们把解题交给dfs,重重递归解决题目:
起首通事后序遍历 , 我们可以确定根节点 (输出打印)
通过在中序遍历中找到根节点的位置,可以区分左右子树
区分出左右子树后,就可以继续探求左右子树的根节点 ,重复1 - 2操纵即可。
#include<iostream>
#include<string>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
伤心客
论坛元老
这个人很懒什么都没写!
楼主热帖
《百万IT毕业生的心声:IT专业大学生毕 ...
Java打怪之路----谷粒商场认证服务 ...
xtrabackup2版本和xtrabackup8版本对比 ...
Excelize 发布 2.6.1 版本,支持工作簿 ...
sqlserver导入sql文件的方式
原型设计工具比较及实践--滴爱音乐 ...
Flink-使用流批一体API统计单词数量 ...
Snowflake(雪花算法),什么情况下会 ...
基于 SpringBoot + MyBatis 的博客系统 ...
SQL Server 2008下载及安装
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表