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函数、回溯的技巧还需在题目中多多发现,加紧练习吧~