深度优先搜索和和广度优先搜索

740 阅读1分钟

定义

深度优先搜索(Depth-First Search,DFS)和广度优先搜索(Breadth-First Search,BFS)是基本的暴力技术,常用于树和图的遍历问题。

  1. DFS:从起点开始走,能走多远就走多远,直到无法行走,然后回退,走另一边,接着往下走,直到访问所有节点。这个方法就是DFS,这个就是栈(递归);
  2. BFS:从起点开始走,往四周走,然后继续往四周走,基本思想就是优先访问已经访问的节点,这个就是队列的实现。

图解

使用BFS和DFS对数进行遍历,节点的访问顺序。 dfs和bfs.png

DFS例题

给一个二维矩阵表示迷宫(0可走,1不可走),给出初始位置,判断是否能走出迷宫。

int a[N][N]//迷宫图 
int bx,by;//起点坐标 
int n,m;//矩阵为n*m 
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//表示往上右下左方向走  
bool dfs(int x,int y)
{
	if(x<0||y<0||x>=n||y>=m) return true;//如果超出范围,返回可以走出 
	a[x][y]=1;//走过设置为1不可再走。 
	for(int i=0;i<4;i++)
	{
		int cx=x+dx[i],cy=y+dy[i];
		if(a[cx][cy]==0)//如果可以走 ,继续走下一步 
		{
			if(dfs(cx,cy)) return true;//如果返回结果为true,则返回true;	
		}	
	}
	return false;	
} 

BFS例题

给一个二维矩阵表示迷宫(0可走,1不可走),给出初始位置,算出最少几步能走出迷宫。

int a[N][N]//迷宫图 
int bx,by;//起点坐标 
int n,m;//矩阵为n*m 
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//表示往上右下左方向走  
int BFS()
{
	queue<pair<pair<int,int>,int>> q;//一个用于保存位置,一个用于保存走到当前位置的步数;
	q.push({{bx,by},0});
	a[bx][by]=1;
	while(!q.empty())
	{
		auto t=q.front();q.pop();//去除对头元素 
		int x=t.first.first,y=t.first.second;
		int step=q.second;
		for(int i=0;i<4;i++)
		{
			int cx=x+dx[i],cy=y+dy[i];
			if(x<0||y<0||x>=n||y>=m) return step+1;//如果超出范围,直接返回步数; 
			if(a[cx][cy]==0)//如果可以走 ,将其坐标放入队列 
			{
				q.push({{cx,cy},step+1});  
				a[cx][cy]=1;//设置当前位置为1表示已经走过 
			}	
		}
	}
}