DFS的过程中,最重要的一个特点就是一个位置只要有路,就一直走到最深处,直到无路可退,再退回一步,看在上一步的位置能不能换个方向继续向下走。这样就遍历了所有可能能到的位置。
因为DFS的独特特性,它比BFS更快的把某个区域走完。在BFS还在慢慢走,走一步撤回一步的时候,DFS能更快的把一个区域走完。这就是它为什么用来做某些题的原因。
这是我之前写的文章,欢迎看并且留言。
例题 ZipRecruiter CodeSignal 原题
答案:
这道题的变形在于只能走diagnal,那么arr1[4], arr2[4]
就应该相应更改为符合相应坐标变化的点。
4.4.2 回溯和剪枝
前面提到的DFS搜索,基本的操作是将所有的节点全部拓展出来,再选取最新的一个节点进行拓展。
不过在很多情况下,用递归列举出所有的路径可能因为数量太大而超时。由于很多子节点是不符合条件的,可以在递归的时候“看到不对头就撤退”,中途停止拓展并返回。这个思路就是回溯,在回溯中用于减少子节点拓展的函数就是剪枝函数。
大部分DFS搜索题目都需要用到回溯的思路,其难度主要在于拓展子节点的时候如何构造停止递归并返回的条件。这需要通过大量的练习相关题目才能熟练应用。
八皇后问题是经典的回溯和剪枝问题。
八皇后问题:在棋盘上放置8个皇后,使得它们不同行,不同列,不同对角线。N皇后是八皇后问题的拓展。