BFS+DFS

1.什么是搜索:

BFS+DFS_第1张图片

2.在acm和平时的题目中,并不会出现遍历一棵树这样的题目,因此,如何将其状态转化成树的节点,就尤其地重要。

3DFS

顾名思义:就是优先向搜索树深层进行搜索的算法。

深度优先遍历图的方法是,从图中某顶点v出发:

(1)访问顶点v;

(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;

(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 当然,当人们刚刚掌握深度优先搜索的时候常常用它来走迷宫.事实上我们还有别的方法,那就是广度优先搜索(BFS).

递归!

BFS+DFS_第2张图片

伪代码如下:

void DFS(状态A)
{
    if(A不合法)
        return 其父亲节点
    if(A为目标状态)
        输出(或者记录节点)
    if(A不为目标状态)
        DFS(A+¥)//调用递归
}

马踏棋盘题目,cur判断是否已经到达最后结果,x和y为当前所在的坐标。

 BFS+DFS_第3张图片

BFS 宽搜

需要利用队列进行实现的

和深搜不同,广搜会将目前所有的状态的每一种子状态压缩进入队列记录,检查队列是否为空,如果不为空,将队首节点弹出,并且以此节点为“根节点”进行宽度搜索。

伪代码:

q.push(head)
while(!q.empty())
{
    temp=q.front();
    q.pop();
    if(temp为目标状态)
        输出
    if(temp不合法)
        continue
    if(temp合法)
        q.push(temp+$) 将其所有子节点压入这个queue中
}

 

你可能感兴趣的:(BFS+DFS)