近期的学习任务是DFS和BFS,之前因为对树一类的问题比较感兴趣去研究过,但现在学起来仍旧觉得很复杂,所以开始也没有去动手做题,明天再开始吧,每日的做题量也稍微加大一些,最近主要是在看各种资料。
一个是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中
}
谈一下自己的感觉,较之之前的dp,代码变长了不少,dp难点是找到状态转移方程,搜索的关键是怎么去书写那个函数,两者其实还有点像,对我个人而言,搜索要比dp友善不少。
明天也要加油鸭!