DFS与BFS

一. DFS的简要说明

DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种。是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点 。
在这里插入图片描述

二.BFS的简要说明

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

在这里插入图片描述

三. DFS与BFS的数据区别

用通俗点的话来说,DFS是一个比较执着的人,一条路走到黑的那种;BFS则是比较稳重的人,一层一层的走。
这里我们看一下啊它们两个的主要区别
在这里插入图片描述

四.DFS 例题介绍

AcWing 842. 排列数字


//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总的视频讲解噢

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值