【总结】DFS算法模板及题型分类

DFS算法模板及题型分类


题型分类:

写过这些入门题后,我们可以将DFS题分为两大类:
1 . 地图型:这种题型将地图输入,要求完成一定的任务。因为地图的存在。使得题意清楚形象化,容易理清搜索思路。

  • AOJ 869-迷宫(遍历地图,四向搜索)
  • HDU 1035-Robot Motion(指定方向搜索,迷路(循环)判断)
  • HDU 1045-Fire Net(check函数,回溯)
  • HDU 1010-Tempter of the Bone(奇偶剪枝,回溯)

2 . 数据型:这种题型没有给定地图,一般是一串数字或字母,要求按照一定的任务解题。相对于地图型,这种题型较为抽象,需要在数据中进行搜索。数据以数组的形式存储,那么只要将数组也当作一张图来进行搜索就可以了。

  • HDU 1016-Prime Ring Problem(回溯、素数筛)
  • HDU 1258-Sum It Up(双重DFS递归,去重技巧)
  • HDU 1015-Safecraker(回溯,字符处理)
  • HDU 2676-Sudoku(抽象,回溯)

算法模板:

由此可以总结一个DFS的基本套路:

判出口(终点、越界)->剪枝->扩展->标记->递归->还原

伪代码如下:

void dfs()//参数用来表示状态  
{  
    if(到达终点状态)  
    {  
        ...//根据题意添加  
        return;  
    }  
    if(越界或者是不合法状态)  
        return;  
    if(特殊状态)//剪枝
        return ;
    for(扩展方式)  
    {  
        if(扩展方式所达到状态合法)  
        {  
            修改操作;//根据题意来添加  
            标记;  
            dfs();  
            (还原标记);  
            //是否还原标记根据题意  
            //如果加上(还原标记)就是 回溯法  
        }  

    }  
}  

一些诸如剪枝、去重、check函数、回溯的技巧还需在题目中多多发现,加紧练习吧~

你可能感兴趣的:(DFS(深度优先搜索))