一、BFS
bfs一层一层地遍历图或树,一般用队列实现,可以计算距离目标的步数。
二、例题
1)
力扣https://leetcode.cn/problems/shortest-bridge/ 这道题实际是计算两个岛屿之间的最短距离,可以先用dfs搜索到第一个岛屿并且记录第一个岛屿的每对坐标,接着以这些坐标作为bfs的起始节点集合,一层一层地向外遍历,寻找第二个岛屿,当找到第二个岛屿时,当前遍历的层数减一就是两个岛屿之间的最短路径。
tips: 将第一个岛屿的坐标值标为2,方便区分两个岛屿
bfs遍历过程中,将0标为2,表示已加入了第一个岛屿
class Solution {
public:
int shortestBridge(vector<vector<int>>& grid) {
int n = grid.size();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
dfs(grid,i,j);
return bfs(grid);
}
}
}
return 0;
}
int bfs(vector<vector<int>>& grid){
int level = 0;
int m;
int n = grid.size();
while(!first.empty()){
level++;
m = first.size();
while(m--){
auto[a,b] = first.front();
first.pop();
for(int i=0;i<4;i++){
int x = a + path[i];
int y = b + path[i+1];
if(x>=0 && y>=0 && x<n && y<n){
if(grid[x][y]==0){
grid[x][y] = 2;
first.push({x,y});
}else if(grid[x][y]==1){
return level-1;
}
}
}
}
}
return 0;
}
void dfs(vector<vector<int>>& grid,