一般来说用BFS解决的问题都可以用DFS来解决。
bfs=队列,入队列,出队列;dfs=栈,压栈,出栈
深度优先算法适合目标比较明确,以找到目标为主要目的的情况,例如走迷宫问题;
广度优先算法适合在不断扩大遍历范围时找到相对最优解的情况,例如最短路问题。
但是其实在平时的题目中,并不会出现遍历一棵树这样的题目,因此,如何将其状态转化成树的节点,就尤其地重要。
DFS模板:
void DFS(状态A)
{
if(A不合法)
return 其父亲节点
if(A为目标状态)
输出(或者记录节点)
if(A不为目标状态)
DFS(A+¥)//调用递归
}
BFS模板:
q.push(head)
while(!q.empty())
{
temp=q.front();
q.pop();
if(temp为目标状态)
输出
if(temp不合法)
continue
if(temp合法)
q.push(temp+$) 将其所有子节点压入这个queue中
}