基本概念

深度优先搜索算法(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);
}

最新文章

  1. jQuery5~7章笔记 和 1~3章的复习笔记
  2. 自定义组件-IPEdit
  3. python实验二:字符串排序
  4. HTTP基本认证(Basic Authentication)的JAVA示例
  5. js默认比较第一个数字大小
  6. ASP.NET的一套笔试题
  7. 【JSP】JSP检查字符串是否为数字
  8. 从头开始学JavaScript (四)——操作符
  9. Linux的学习笔记_Day1
  10. Python scrapy------分类获取美团整站数据
  11. 优雅地实现CSS Animation delay
  12. python中的shutil模块
  13. MR目录结构
  14. [转载]WebService使用的一些总结
  15. oracle 数据库中(创建、解锁、授权、删除)用户
  16. Redis:五种数据类型的简单增删改查
  17. input.text文件提示效果
  18. PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
  19. SVN服务器更换IP,客户端重新定位
  20. 21、python操作redis的模块?

热门文章

  1. linux - python - 异常:error while loading shared libraries
  2. android TextView 支持长按自由复制
  3. 143. 最大异或对(Trie树存整数+二进制)
  4. git命令全景图
  5. 自己动手系列----使用数组实现一个简单的Map
  6. mysql中循环插入数据
  7. youtube-dl parameters
  8. k线、指标绘制
  9. Form表单利用Jquery Validate验证以及ajax提交
  10. ubuntu 安装谷歌