深度优先搜索
深度优先搜索,简称dfs,考场常用暴力枚举手段之一,得分随缘,提前退役的有效途径(去年noip dfs第二题12分,第三题0分);
虽然看起来dfs莫得卵用,但他确实莫得卵用(如果我们不优化),我们还是要学(wy还是要求我们写),就当是复习好了(如果考裸题我当场吃屏幕)。
作为搜索的一种方式,dfs的关键词是深度优先,什么是深度优先呢?
举个例子,假如小T要从自己家到小A家玩,可能经过如超市,学校,小W家或小Y家等场所,现在已知场所Xi分别连接了场所Y1——Yj,求有多少种路径可以到达?
dfs就是一条路先走到底,如果可行就令答案加一,再继续从头走下一条路,而与之相对的bfs(广度优先搜索)则是每走到一个场所,就将接下来能走到的所有场所的信息存下来,挨个枚举(更容易爆)。
不会做图,所以下面挖了一张别人博客的示意图
bfs
dfs
代码实现的话,一般都是用函数,因为要递归,刚学可能比较恶心,习惯就好,这里以洛谷
P1706 全排列问题
为例
我滴任务完成了
#include<bits/stdc++.h> using namespace std; int n,mark[10],ans[10]; //n->序列长度,mark->记录某个数是否使用过,以保证序列不重复 void dfs(int u) { //递归出口 if(u==n+1) { for(int i=1;i<=n;i++)cout<<" "<<ans[i]; cout<<endl; return; } //枚举序列第u位的数字 for(int i=1;i<=n;i++) { //如果当前数字未使用过 if(mark[i]==0) { //标记 防重复 mark[i]=1; //向更深一层遍历,即枚举第u+1位的数字 ans[u]=i; dfs(u+1); //数字i已经使用过了,将i取出,使mark[i]=0,防止阻碍后面使用i mark[i]=0; } } return; } //u->已构建的序列长度 int main() { cin>>n; dfs(1); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】