首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权!
 
1.概念
 
回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别的路径
 
也就是说 走到死胡同里边就往回走,直到找到出口.
回溯 是一种 选优搜索 。许多复杂规模较大的问题都可以用 回溯 解决 ,因此回溯法有 “通用解题方法”的美称。
 
 
 
2.思想
 
 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。而 若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
 
3.具体做法
 
  (1)确定解空间,里边至少包含一个(最优)解。
  (2)确定结点的扩展搜索规则。
  (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
 
4.
 (1)问题框架
   设问题的解是一个n维向量(a1,a2,………,an),约束条件是ai(i=1,2,3,…..,n)之间满足某种条件,记为f(ai)。
 
 
(2)非递归回溯框架

   1:int a[N],i; //i 当前位置
2: 初始化数组a[];
3: i=1;
4:while(i>0(有路可走) and (未达到目标)) {
5: //如果说还没找到出口,就一直找,找不到别回来见我
6: if(i>n) // 如果说1-i的节点都找到了,就出这个屋
7: {
8: 搜索到一个解,输出;
9: }
10: else // 处理第i个元素
11: {
12: a[i]拿第一个可能的值;
13: while(a[i]在不满足约束条件且在搜索空间内)
14: {
15: a[i]下一个可能的值;
16: }
17: if(a[i]在搜索空间内)
18: {
19: 标识占用的资源;
20: i=i+1; // 扩展下一个结点
21: }
22: else
23: {
24: 清理所占的状态空间; // 回溯
25: i= i –1;
26: }
27:}
 
1.如果说 一个屋子有多个目标点 :
 
总目标 = 所有目标点都找到
 
2.因为a[i]往下拿 拿到的节点不会重复 所以不会回到老路上去,所以只可能有一种方式出循环--找不到
 
3.我在这 把 JC向北 的意思转述一下:
 
while(i>0(还有路可走)&&没找到总目标){
if(i>n){
//如果说 最后一条路 a[n]找到了
保存 //如果还想找接着写条件
}else{
a[i]取到(相对于 a[i-1]所到达的节点的)下一条路径的第一条
while(第一条路a[i]不满足条件&&没出空间){
a[i]取到下一条
}
//接下来就要判断这条路O不OK?(实际上只要判读a[i]取到的这条路O不OK)
if(a[i]在范围内){
OK ,i++; //去找走的通的a[i+1]
}else{
i--; //回溯 这个a[i]没在上一条路径的基础上找到可行的路径
//退回去让保存上一条路径的a[i-1]试取下一个点
}
}
}
 
解决 找一个门的问题套路
while(有路可走 &&没找到){
if(找到1条路){
保存
}else{
找第一条路
while(){
找下一跳路
} if(最后一条路满足条件){
i++; //走下一保存资源
}else{
i--; //回到上一保存资源
}
}
}
 
(3)递归框架
回溯法是对解空间的深度优先搜索,在一般情况下使用递归函数来实现回溯法比较简单,其中i为搜索的深度,框架如下:

   1:int a[i];
2:try(int i)
3:{
4: if(i>n)
5: 输出结果;
6: else
7: {
8: for(j= 下界; j<= 上界;j=j+1) // 枚举i所有可能的路径
9: {
10: if(fun(j)) // 满足限界函数和约束条件
11: {
12: a[i]= j;
13: ... // 其他操作
 
 
 
 
 
 
 

回溯 DFS 深度优先搜索[待更新]的更多相关文章

  1. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  2. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  3. HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  4. 步步为营(十五)搜索(一)DFS 深度优先搜索

    前方大坑预警! 先讲讲什么是搜索吧. 有一天你去一个果园摘梨子,果农告诉你.有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图例如以下: S 0 0 0 0 0 0 0 0 0 0 0 0 ...

  5. [算法总结]DFS(深度优先搜索)

    目录 一.关于DFS 1. 什么是DFS 2. DFS的搜索方式 二.DFS的具体实现 三.剪枝 1. 顺序性剪枝 2. 重复性剪枝 3. 可行性剪枝 4. 最优性剪枝 5. 记忆化剪枝 四.练习 一 ...

  6. 『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)

    从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~ ...

  7. DFS——深度优先搜索的一般格式

    DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从 ...

  8. ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)

     小鼠迷宫问题 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1  Solved: 1 [Submit][Status][Web Board] Desc ...

  9. HDU 1312 Red and Black DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

随机推荐

  1. 项目中Gradle使用总结

    一.配置Gradle使用Maven仓库 项目过程中,我们可能会遇到maven的本地库和gradle使用的maven本地库,不是同一个库.现在总结下怎么配置使得maven和gradle都使用相同的mav ...

  2. C++的学习资源

    本文总结了几个好的C++网站,以及C++方面的经典书籍.所列书籍或标准可以到这里找找电子版. wikipedia关于C++有关条目,注意看后面“参考文献”和“外部链接”: C++ programmin ...

  3. 出现( linker command failed with exit code 1)错误总结 (转)

    这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. ...

  4. git命令大全

    git init                          # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx"   ...

  5. Android下载更新代码

    其实是昨天反编译一个apk,给它添加一个自动更新的功能用到的.为了在smali下方便查看,代码写的不规范,反正到了smali都一个吊样~~~~ 权限: <uses-permission andr ...

  6. 动态生成元素动作绑定,jquery 1.9如何实现

    1.7后增加了 live()1.9后被移除了 网上说可以用 on() 代替 可以实际在动态生成元素上绑定动作,没效果,求解绝方法(用低版本的jQuery这种方法,求别说..) 答: 之前有老兄回答过类 ...

  7. linux日常运维管理

    1.查看系统负载命令 w命令:主要查看cpu负载 load average:一分钟内负载 五分钟内负载 十五分钟内负载 负载跟cpu核心数有关,查看cpu核心数: # cat /proc/cpuinf ...

  8. java中的集合类(Collection)中的Set

    set集合不包含重复元素及与我们无关的排序!我说hibernate实体类中的集合都用Set呢,难道是因为这个?

  9. MSXML应用总结

    MSXML的DOM模型是符合W3C DOM标准的,而DOM API在Windows中以COM接口的形式提供,关于COM请大家查阅相关资料.简单来说,COM提供了一个环境和一套规则,使接口的设计实现到对 ...

  10. jquery checkbox的相关操作——全选、反选、获得所有选中的checkbox

    1.全选 $("#btn1").click(function(){ $("input[name='checkbox']").attr("checked ...