一. DFS的简要说明
DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种。是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点 。
二.BFS的简要说明
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
三. DFS与BFS的数据区别
用通俗点的话来说,DFS是一个比较执着的人,一条路走到黑的那种;BFS则是比较稳重的人,一层一层的走。
这里我们看一下啊它们两个的主要区别
四.DFS 例题介绍
//DFS 回溯 排列数字 (一条路走到黑)
void dfs(int u)
{
if(u == n) //到数字都填满时输出
{
for(int i = 0;i < n;i++) cout<<path[i]<<" ";
cout<<endl;
return;
}else
{
for(int i = 1;i <= n;i++)
{
if(!st[i]) //确定该点是否使用过
{
path[u] = i;
st[i] = true;
dfs(u + 1); //递归
path[u] = 0; //回溯
st[i] = false; //回溯 没有理解 }
}
}
}
```回溯的过程想当重要噢
强化训练
843. n-皇后问题
这个皇后问题主要考查的问题是剪枝问题和排列数字的模板也差不多,这里把该题模板代码放这
//DFS 剪枝 n-皇后问题
void dfs(int u)
{
if(u == n)
{
for(int i=0;i<n;i++) puts(g[i]);
cout<<endl;
return ;
}
else{
for(int i=0;i<n;i++)
{
if( !col[i] && !dg[u+i] && !udg[n-u+i] ) //col (行) dg (对角线) udg(反对角线)
{
g[u][i] = 'Q';
col[i] = dg[u+i] = udg[n-u+i] = true;
dfs(u + 1);
g[u][i] = '.';
col[i] = dg[u+i] = udg[n-u+i] = false;
}
}
}
}
五.BFS例题介绍
AcWing 844. 走迷宫
这里的 typedef pair< int , int > PII; 意思是PII这个q数组里面每一位是存了两个数字例如p[1] = {x,y},在这里的作用是存坐标
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair< int , int > PII;
const int N = 110;
int n,m;
int g[N][N],d[N][N];
PII q[N*N];
int bfs()
{
memset(d , -1 , sizeof d); //将d二维数组所有权值变为-1
d[0][0] = 0;
int hh = 0,tt = 0;
q[0] = {0,0};
int dx[4] = {-1,0,1,0} ,dy[4] = {0,1,0,-1}; //该点可以走的四个方向
while(hh<=tt)
{
PII t = q[ hh ++ ];//每一次取出来队头元素
for(int i=0;i<4;i++)//枚举该点往四个方向走的权值
{
int x = t.first + dx[i],y = t.second + dy[i];
if(x>=0 && y>=0 && x<n && y<m && g[x][y] == 0 && d[x][y] == -1)
{
d[x][y] = d[t.first][t.second] + 1;
q[ ++tt ] = {x,y};
}
}
}
return d[n-1][m-1];
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
cout<<bfs()<<endl;
return 0;
}
强化训练
AcWing 845. 八数码
八数码这个题有点难理解,但是主考查bfs,大家可以去写一下,不懂的那里有Y总的视频讲解噢