对比深搜与广搜
Crescent_Rose_ · · 个人记录
总结深搜和广搜的一些区别
深搜:一条路走到黑,不行就退一截再走到底
广搜:每条路都试探着走,一点一点往深处推进
拿一棵搜索形成的树来举例:
深搜遍历顺序:
广搜遍历顺序:
深搜:相当于树的先序遍历
广搜:相当于树的层次遍历
深搜:用的是栈空间,结点先进后出
广搜:用的是队列空间,结点先进先出
深搜:一个点可以搜到多次
广搜:一个点只能搜到一次,因为一般第一次搜到就是最优情况
深搜:应用更广,个人认为更好写
广搜:目前觉得在二维棋盘中求某点到某点的最短路径比较方便,因为第一个搜到的答案就是最短的路径
深搜模板:
int dfs(参数)
{
判断当前结点是否合法,不合法直接返回
判断当前结点是否符合结束条件,符合就返回答案
标记当前结点为已搜
for(int i=1; i<=生成结点数; i++){
dfs(新结点的参数);
}
回溯,把当前节点标记为未搜
}
还有一种
int dfs(参数)
{
判断当前结点是否符合结束条件,符合就返回答案
标记当前结点为已搜
for(int i=1; i<=生成结点数; i++){
if(新生成的结点合法){
dfs(新结点的参数);
}
}
回溯,把当前节点标记为未搜
}
广搜模板:
//q是队列
int bfs(参数)
{
初始化,把根节点入队
while(!q.empty()){
判断当前结点(q.front())是否符合结束条件,符合就直接返回答案
for(int i=1; i<=生成结点数; i++){
if(新生成的结点合法 && 新生成的结点未搜过){
q.push(新结点);
}
}
标记当前结点为已搜
q.pop();
}
}