定义
深度优先搜索(Depth-First Search,DFS)和广度优先搜索(Breadth-First Search,BFS)是基本的暴力技术,常用于树和图的遍历问题。
- DFS:从起点开始走,能走多远就走多远,直到无法行走,然后回退,走另一边,接着往下走,直到访问所有节点。这个方法就是DFS,这个就是栈(递归);
- BFS:从起点开始走,往四周走,然后继续往四周走,基本思想就是优先访问已经访问的节点,这个就是队列的实现。
图解
使用BFS和DFS对数进行遍历,节点的访问顺序。
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表示已经走过
}
}
}
}