1. 问题描述:

深度优先搜索特别适用于那些探索所有的可能性的这些问题,问题解决的可能性是非常多的,所以需要去探索所有的可能性,从而找到所有能够满足问题的解决方案或者是解决方案中最优的那一个,下面是使用深度优先搜索比较经典的例子

2. 具体的例子如下:

① 比如数独游戏,走迷宫这些都是可以使用深度优先搜索来进行解决,数独游戏中尝试着往格子里面填入1-9的数字,每一个格子都是这样去尝试,最终可以得到完整的填满数字的数独,而迷宫问题则是对于当前这个位置我尝试着去走,假如这条路走不通,那么我换一条别的路径看一下能否走得通,这也体现了深度优先搜索的特点,先纵后横,一条路走到黑,走不通退回来走其他的路径

深度优先搜索经常要结合回溯来进行使用,为什么需要进行回溯呢?原因是当前我尝试这种的可能的方案,但是我需要尝试另外一种方案,这个时候就需要将之前已经填过的数字清除,这样在尝试其他的状态(下一次的递归调用)的时候才不会受到上一次递归调用的影响,所以回溯通常是递归调用的时候上一次对下一次调用的时候有影响的时候我们需要清除一下之前的状态

② 八皇后问题,深度优先典型的例子,每一个行的每一个位置我都尝试去放置皇后,假如不行那放到当前行其他位置,当无论如何当前行都不能够放置那么我们退回到上一次放置的地方,尝试在上一次的那一行将皇后放置在其他的位置这样去尝试所有的可能性

③ 全排列的递归加上回溯框架的求解,将当前位置与当前位置以及以后的位置上的元素进行互换,因为第一次的时候下标为1的这个位置与1以及其他的位置进行交换,所以当下标为2的时候时候那么只需要与2以及以后以后的位置进行交换,因为在下标为1的时候已经与2进行了交换,这个时候不需要再将下表为2的元素与下标为1的元素进行交换,其他的元素也是一样的,所以需要使用递归来进行求解,在for循环中嵌套递归

④ 部分和,给出的n个数字中找到m和数字加起来等于sum,对于当前的元素我可以选择要,使其参与到构成目标sum的元素中,也可以选择不要,这样就形成了两个平行状态,类似于一棵二叉树的搜索,分别递归左子树与右子树,将当前节点分为左右节点去求解,所以也是在尝试每一种的可能性,最终可以得到若干个能够加起来的和等于目标sum的数字序列

⑤ 检验连通性的问题,例如八联通检测与死联通检测的问题,深度优先也别适合于这类检验连通性问题的求解,因为dfs会把所有连在一起的元素在一次的递归调用都会连接到,所以特别适合于解决这类问题,还有就是水洼的数量的例子也是类似的检验连通性的问题

通常在搜索的时候将数组中的元素变为相反的元素,在水洼的数目的例子中使用这个就是一个套路,每调用dfs就将水洼变成了干燥的块:

for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){//有'W'的地方说明有积水if(arr[i][j] == 'W'){dfs(arr, i, j);count++;}    }
}private static void dfs(char[][] arr, int i, int j) {arr[i][j] = '.';for(int k = -1; k <= 1; k++){for(int l = -1; l <= 1; l++){if(k == 0 && l == 0) continue;if(i + k >=0 && j + l<= arr[0].length - 1 && i + k <= arr.length - 1 && j + l >=0){if(arr[i + k][j + l] == 'W'){//继续搜寻它的下一个积水dfs(arr, i + k, j + l);}}}} }

⑥ 树和图的遍历,特别是在对树的节点的操作中,经常要使用到dfs,中序遍历。前序遍历,后序遍历这些都要使用到递归来求解,求解某个节点的高度等等这些问题,还有就是在图的遍历中也是如此,一个节点可以通过dfs连到另外一个与之相连的节点

3. 可以看到几乎所有尝试可能性的问题都可以使用dfs来解决

深度优先搜索的例子以及分析相关推荐

  1. 一个比较笨的全文搜索的例子(分析结构用)-模糊查找

    1 2 3 4 --在所有的char类型的列中模糊查找某个值. 5 --**注意预先切换到当前的数据库中. 6 DECLARE @TABLE_CATALOG NVARCHAR(MAX)--数据库名 7 ...

  2. AI(人工智能:一种现代的方法)学习之:无信息搜索(uninformed search)算法——广度优先搜索、深度优先搜索、Uniform-cost search

    文章目录 参考 搜索算法 深度优先搜索 depth-first search 性能分析 完整性 complete 最优性 optimal 时间复杂度 空间复杂度 广度优先搜索 breadth-firs ...

  3. 【LeetCode 深度优先搜索专项】不同岛屿的数量 II(711)

    文章目录 1. 题目 1.1 示例 1.2 说明 1.3 提示 1.4 进阶 2. 解法一(深度优先搜索) 2.1 分析 2.2 解答 2.3 复杂度 1. 题目 给定一个 m×nm \times n ...

  4. 搜索算法---深度优先搜索

    目录 一.通过下面一个问题总结深度优先搜索 1.深度优先搜索的一般步骤 2.深度优先搜索的特点 3.深度优先搜索的代码实现 二.例题分析 1.员工重要性 2.图像渲染 3.岛屿的周长 4.被围绕的区域 ...

  5. 深度优先搜索和广度优先搜索及典例分析(走迷宫问题(BFS)和棋盘问题(DFS))

    搜索算法在实际编程应用中起着举足轻重的作用,学会掌握搜索算法并熟练应用搜索算法来解决实际问题不得不说是一件相当COOL的事,所以我将深度搜索和广度搜索认真地做了详细的总结,与诸君共勉,也方便以后查阅复 ...

  6. 深度优先搜索和广度优先搜索的比较与分析

    一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...

  7. 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)

    前言 你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfs和bfs就觉得好像懂算法了,无所不能,确实如此,学会dfs和bfs暴力搜索枚举确实利用 ...

  8. 图:BFS(深度优先搜索)图解分析代码实现

    文章目录 一.介绍 二.图的建立 2.1建立图类 2.2建立图 三.BFS 3.1图解: 3.2代码 四.DFS和BFS完整代码 一.介绍 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种 ...

  9. 图:DFS(深度优先搜索)图解分析代码实现

    文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...

最新文章

  1. iOS动画开发之五——炫酷的粒子效果
  2. sql语句数据行操作-虽然一般不用
  3. opencv 运动目标检测
  4. 详解 Cookie 纪要(vue.cookie,jquery.cookie简化)
  5. MySQL高级-触发器
  6. LeetCode刷题系列之数组--0704.二分查找(JAVA版本)
  7. 大带宽、高灵敏度、扫描快速手持式监测接收机TFN DC700S
  8. linux gmac10下载,ethmac10g verilog代码 10G eth mac verilog代码参考下载 - 下载 - 搜珍网...
  9. python opencv 图像大小_python使用OpenCV设置图片尺寸
  10. python中常用的utils
  11. 哈希函数——SHA1
  12. 从零开始的2D游戏开发 —— 像素方块生成器
  13. 六子棋的程序(修改)
  14. 【加密与解密】Openssl 生成的RSA秘钥如被C#使用解密
  15. sql注入--POST注入
  16. 每日一笑:一个笑话,说清女人
  17. android+复杂绘图工具,Inker - 专业级矢量图绘画工具,功能不输桌面应用 - Android 应用 - 【最美应用】...
  18. office 365 ppt创意方法(拉开幕布)
  19. 硬盘无法格式化怎么解决?数据丢失怎么恢复?
  20. java企业客户管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. EasyCVR国标GB28181协议接入下的TCP和UDP模式说明及差异
  2. SI 设置全选快捷键
  3. vim全选,全部复制,全部删除快捷键
  4. 亮度值与RGB的转换
  5. Springboot实现支付宝沙箱支付功能
  6. 项目管理9大知识思维导图-精减版+教你如何绘制专属思维导图
  7. 【论文】Tishby‘s talk about Information Bottleneck 翻译(一)
  8. 强制将int转化为float
  9. 7-3 分段函数1 (20分)
  10. ReactTaro仿抖音小程序H5(一)