DFS(深度优先搜索)
2024-09-03 13:47:21
基本概念
深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
算法思想
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
代码框架
void dfs(参数){
if(到达边界){
执行操作;
return;
}
尝试每种可能{
if(满足条件){
标记;
dfs(参数);
回溯;
}
}
}
例题
输出自然数1到3所有不重复的排列,即3的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
看到这,你可能会想:这还不简单?用枚举扫一遍不就行了?
当然,如果是输出1到3的全排列,用枚举还是可以AC的,但把题目换成输出1到n的全排列(n由用户输入),枚举就用不了了。
这时,我们的dfs同学就派上用场。
代码实现
将刚才的dfs框架套一下:
#include <iostream>
#define n 3
using namespace std;
int ans[10],book[10];
void dfs(int x){
int i;
if(x==n+1){
for(i=1;i<=n;i++)
cout << ans[i] << " ";
cout << "\n";
return;
}
for(i=1;i<=n;i++)
if(book[i]==0){
ans[x]=i;
book[i]=1;
dfs(x+1);
book[i]=0;
}
}
int main(){
dfs(1);
}
最新文章
- jQuery5~7章笔记 和 1~3章的复习笔记
- 自定义组件-IPEdit
- python实验二:字符串排序
- HTTP基本认证(Basic Authentication)的JAVA示例
- js默认比较第一个数字大小
- ASP.NET的一套笔试题
- 【JSP】JSP检查字符串是否为数字
- 从头开始学JavaScript (四)——操作符
- Linux的学习笔记_Day1
- Python scrapy------分类获取美团整站数据
- 优雅地实现CSS Animation delay
- python中的shutil模块
- MR目录结构
- [转载]WebService使用的一些总结
- oracle 数据库中(创建、解锁、授权、删除)用户
- Redis:五种数据类型的简单增删改查
- input.text文件提示效果
- PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
- SVN服务器更换IP,客户端重新定位
- 21、python操作redis的模块?