BFS和DFS不同的应用场景:
1)BFS:BFS 可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。BFS 先搜索到的结点,一定是距离最近的结点。
BFS求最短路径问题的模板:
depth = 0 # 记录遍历到第几层,也即路径距离
while queue 非空:
depth++
n = queue 中的元素个数
循环 n 次:
node = queue.pop()
for node 的所有相邻结点 m:
if m 未访问过:
queue.push(m)
2)DFS:递归求解,通常用于求最长距离
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
该题要求每个位置到最近的0的距离,而每个位置取值分两种情况:
1)值为0,到最近的0的距离也为0,;
2)值为1,以该位置为起点进行BFS按层扩展BFS,到达有0的位置的层数即为最短距离。
先将所有的0入队:
class Solution {
public:
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
vector> updateMatrix(vector>& mat) {
vector> ans;
int rows=mat.size();
int cols=mat[0].size();
queue > q;
for(int i=0;i=0 && new_x=0 && new_y
先将0邻近的1入队:
class Solution {
public:
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
vector> updateMatrix(vector>& mat) {
int rows=mat.size();
int cols=mat[0].size();
// vector > ans;
vector> ans(rows, vector(cols,0));//vector初始化为0
queue > q;
for(int i=0;i=0 && new_x=0 && new_y=0 && new_x=0 && new_y
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
该题要求直到单元格中没有新鲜橘子为止所必须经过的最小分钟数,也即求从腐烂橘子到达所有的新鲜橘子的最小距离的最大值。
先将所有的腐烂橘子入队,然后进行多源BFS层序遍历,并在层序遍历过程中将遇到的新鲜橘子编腐烂入队,作为下一层节点,当没有新鲜橘子或者腐烂橘子全部出队时,结束BFS。
class Solution {
public:
int orangesRotting(vector>& grid) {
int rows=grid.size();
int cols=grid[0].size();
queue> q;
int fresh_cnt=0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int max_time=0;
for(int i=0;i0 && !q.empty())//注意条件fresh_cnt不能少,否则会多计算
{
int len=q.size();
for(int k=0;k=0 && new_x=0 && new_y0)
{
return -1;
}
else{
return max_time;
}
}
};