同样会有一天,如果你有了可以教给别人的东西,他们就能从你这儿学到,这种方式是美好的,有来有往的。这不是教育,而是历史,是诗歌。
——《麦田里的守望者》【美】杰罗姆•大卫•塞林格
BFS和DFS一直是我的心病,每次看到相关的题目就发怵,今天还是简单总结一下:
参考资料链接:BFS、DFS算法原理及代码模板(附模板题)
DFS,也就是深度优先搜索,核心思想就是一条路找到底,然后回退一步换一个方向继续。有一个细节是,需要在出递归时把回退到的当前节点标为可访问,
DFS模板:
DFS(int x, int y) //这里假设存的是二维数组,x、y表示两个坐标
{
if (找到解)
{
}
for (......)
//每到一个点下一步都有上下左右四个方向可以走,这里用一个循环遍历方向数组表示四个方向
{
// 如果这个点(a,b)符合要求并且没走过
flag[a][b] = 1; //标记‘1’表示走过
DFS(a, b); //进入下一次递归
flag[a][b] = 0; //回溯,标记‘0’表示可以走
}
}
}
BFS,即广度优先搜索,一般借助队列实现,每次把当前可达的点一次放入队列,寻找下一个节点时继续把可达的节点加到队列后。这样当队列为空时即完成了对所有点的搜索。
BFS模板:
BFS()
{
queue<int> q;//初始化队列Q
while(!q.empty()) //队列不为空
{
if() //判断是否找到了目标
{
}
//队首出队
for()
{
//依旧是四个方向
//符合条件的入队
//标记入队的点
}
}
}
对于不会的事情,就要及时去跟进,及时学会,那就是提升点,一直拖延,就会成为阿克琉斯之踵。
over~
网友评论