DFS(深度优先搜索)
1. 什么是 DFS ?
DFS,即深度优先搜索
传统枚举中需要固定 for 循环的层数,但是这会造成程序非常冗长,而且不能随意增减枚举层数。所以我们使用一种新的利用函数递归枚举的方式,枚举每一个填空中所有可能的选项,然后判断这种选项是否合法。如果这个选项合法的话就填写下一个选项,然后继续;如果这个填空中所有的选项都不合法,那就不用继续枚举下去了,而是去尝试更换上一个填空的选项,继续枚举。这种方式称为回溯算法,常使用深度优先搜索来实现。
2. DFS 的搜索顺序
通俗的讲:所谓的DFS就是一条路走到底,直到无路可走的情况下,才会选择回头,然后重新选择一条路。
利用 DFS 进行遍历的结果为: 7 1 9 0 5 31 2 0 20 3 25 33
3. DFS 的常规模板
void dfs(int k) // k表示递归层数,或者说是要填第几个空。
{
if(所有空已经填完)
{
判断最优解/记录答案;
return;
}
for(枚举这个空能填的选项)
if(这个选项是合法的)
{
记录这个空(保存现场);
dfs(k+1);
取消这个空(恢复现场)
}
}
总结
搜索算法也是一种暴力枚举策略,但是其算法特性决定了效率比直接的枚举所有答案要高,因为搜索可以跳过一些无效状态,降低问题规模。在比赛中,如果无法找到一种高效求解的方法(如贪心、递推、动态规划、公式推导等),使用搜索也可以解决一些规模较小的情况;而有的任务就是必须使用搜索来完成,因此这是相当重要的策略。