BFS、DFS算法原理及代码模板(附模板题)

前言

BFS、DFS这两个搜索算法都是对图的遍历,从图中某点出发,按照某种方法对图的所有顶点进行访问,每个点仅访问一次。

因为图对于树而言相对复杂,其中的任意顶点都可能与其他顶点相邻,所以在图的遍历中必须记录已经被访问过的点。

根据搜索路径的不同,我们可以将遍历图的方法分为两种:广度优先搜索和深度优先搜索。
实现bfs和dfs都需要解决的一个问题就是如何存储图。一般有两种方法:邻接矩阵和邻接表。这里为简单起
见,均采用邻接矩阵存储,说白了也就是二维数组。

实例

我的眼镜掉在了以我为中心边长为5的一块矩阵,现在我要找我的眼镜,假设每次都可以搜索前后左右的任意一个方向,我每次下手找都可以搜索目标方向边长为1的面积,下面我用DFS、和BFS两种方法找我的眼镜…

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’表示可以走
        }
}
}

关于回溯 flag[a][b] = 0; //回溯
假如DFS每次都是按上下左右这个顺序判断是否能走,上走过了,每次都走下这个方向,最后发现走到了死胡同,而每次都标记了走过的坐标,就会导致无法退回去访问进入其他的点
而我们把“ flag[a][b] = 0; //回溯”放在了进入递归的下边,当走入了死胡同往回退的时候,每次出来都把上个点取消标记,仔细想一下,死胡同的这个点因为标记过不会再次进入了

框架

bool vst[maxn][maxn];                       // 访问标记
int map[maxn][maxn];                        // 坐标范围
int dir[4][2] = {
   
   0, 1, 0, -1, 1, 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值