dfs与bfs总结
使用场景
dfs
dfs通常适用于所有解问题;一般规模比较小
注意剪枝,约束条件处剪枝
参考题目:
链接: 自然数的拆分
链接: 放苹果
链接: 八皇后
链接: 棋盘问题
bfs
bfs适用于寻找最优的解,比如最小步数;规模可以比较大
注意标记,遍历过的点标记一下,遍历过的没有必要再入队了
注:连通性问题比如这个题: 细胞,个人觉得dfs,bfs都可以,但是bfs可以解决规模比较大的;dfs/bfs有的题目是图形搜索,有的是没有图的。
模板
dfs
void dfs(层数x,...){
if(找到解){
...//根据题意来
return;
}
if(到尽头了但没有解){
return;
}
for(本层有几个扩展状态){
if(约束条件){
修改操作;
标记;
dfs(x+1,...)
操作还原;
还原标记;
//注:修改与标记 以及是否还原要根据题目来
}
}
}
bfs
void bfs(){
创建队列q;
起点入队;
标记;
while(队列q不为空){
取队首元素start;
start出队;
if(达到目标){
...
return;
}
for(与start相邻的元素){
if(相邻元素不越界&&满足约束){
入队;
标记;
}
}
}
}
推荐文章
链接: DFS与BFS的区别
链接: DFS和BFS入门