DFS搜索算法
作者:@什么时候才能不困
本文为作者原创,转载请注明出处:https://www.cnblogs.com/haggard/p/17857876.html
简介
深度优先搜索算法
基本思想
1.为了求得问题的解,先选择某一种可能情况向前探索;
2.在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索;
3.如此反复进行,直至得到解或证明无解。
操作步骤
有这么一幅图,我们需要知道:求图中的
搜索过程如下:
具体代码实现为:(只展示部分代码)
bool DFS(Node n, int d){ //n代表着是当前节点 ,d表示走的次数
if (d == 4){//路径长度为返回true,表示此次搜索有解
return true;
}
for (Node nextNode in n){//遍历跟节点n相邻的节点nextNode,
if (!visit[nextNode]){//未访问过的节点才能继续搜索
//例如搜索到V1了,那么V1要设置成已访问
visit[nextNode] = true;
//接下来要从V1开始继续访问了,路径长度当然要加
if (DFS(nextNode, d+1)){//如果搜索出有解
//例如到了V6,找到解了,你必须一层一层递归的告诉上层已经找到解
return true;
}
//重新设置成未访问,因为它有可能出现在下一次搜索的别的路径中
visit[nextNode] = false;
}
//到这里,发现本次搜索还没找到解,那就要从当前节点的下一个节点开始搜索。
}
return false;//本次搜索无解
}
例题
学算法当然要刷题领悟啦,不然就是这种一看就会(只是背了下来),一写就废的,下面就让我们一起看看这个俗称不撞南墙不回头算法都有哪些例题!!!
排列问题
#include<bits/stdc++.h>
using namespace std;
int n;
int ans[15];//保存当前的方案
int use[15];//表示每个数是否被用过
void dfs(int x){//X表示当前搜索到那个数
if(x>n){//如果N位都搜索完了,就输出方案并返回
for(int i=1;i<=n;i++)
printf("% 5d",ans[i]);//输出方案
puts("");
return;
}
for(int i=1;i<=n;i++)//从小到大枚举
if(!use[i]){//判断这个数是否用过
ans[x]=i;//保存到方案中
use[i]=1;//标记这个数被使用了
dfs(x+1);//进行下一步搜索
use[i]=0;//撤销标记
}
}
int main()
{
scanf("%d",&n);//输入
dfs(1);//从第一个数开始搜索;
}
所念皆有果,梦中有星海,热爱可抵岁月漫长
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效