做法:
从根节点开始 d f s dfs dfs,用一个变量 d e p dep dep限制 d f s dfs dfs的深度,一旦达到 d e p dep dep层,那么就看是否找到目标;如果在 d e p dep dep层没有搜索到目标,那么就将深度的限制 d e p + 1 dep+1 dep+1,继续从根节点重新开始 d f s dfs dfs,如此反复直到找到目标,或者证明目标不存在;
适用于的题目
- 能够从题目中推断出答案的层次较浅;
- 整个搜索树非常的深而且随着深度的增加,结点增加非常快速;
优势
- 相比于dfs,防止一条路走到底,避免超时
- 相比于bfs,防止在队列中存储的状态过多,避免超空间;
劣势:
每一次都需要从根节点重新开始搜索,会导致重复;
代码基本框架
bool dfs(int cur)
{
if (cur==dep)
{
return true/false;
}
for (cur的邻居)
{
if(dfs(next)==true)
{
return true;
}
}
return false;
}
int main()
{
dep=1;
while (dfs(root)==false)
{
dep++;
}
}
例题:
Sample 1:POJ2248 Addition Chains/UVA529 Addition Chains
思路:
- 搜索的逻辑,从第1个数开始搜索,对于待搜索的第i项,只可能由1到-1的两个数值加起来得到。
注意,需要剪枝