搜索属于暴力的一种,跳过了一些不可行的状态,使枚举的次数更少,从而降低时间复杂度,
是枚举的一种策略。
DFS
一句话描述DFS就是“不撞南墙不回头”
void dfs(参数){
if(跳出条件){
执行语句;
return;
}
for(枚举状态){
if(判断是否可行){
记录状态;
dfs(参数);
取消状态;
}
}
}
上图是DFS模板
注意DFS函数大部分是void类型,DFS函数是一个递归函数。
dfs再进行搜索的时候会向下扩展一个状态,直到无法扩展时,再回溯回去,接着上一次的继续扩展状态,直到全部搜索完。
BFS
BFS适用于查找最短路,同样它也有模板,下图:
queue<数据类型>que;//定义一个队列
void bfs(参数){
que.push();//将最初状态放入队列
while(!que.empty()){
数据类型 变量名=que.front();que.pop();//将队头取出,弹掉
for(扩展状态){
if(状态可取){
que.push();//将状态放入队列
标记状态//让状态不再被搜到
}
}
}
}
注意BFS函数大部分是void,BFS函数不是递归函数。
( 有点乱 )
bfs会把一个点的所有状态都扩展出来,放进队列,然后继续取出队头,继续扩展。
BFS中最短路径储存
我们用bfs可
以最短路的步数,但是如何将最短路记录下来呢?
可以用数组来记录:
如图,由A--B
定义一个 l 数组。
l[A]=-1,l[B]=A,l[F]=A …… ……以此类推
BFS中最短路径打印
用一个递归函数
void print(int i){
if(l[i]==-1){
cout<<l[i]<<" ";
return;
}
print(l[i]);
cout<<l[i]<<" ";
}