搜索算法(四) 广度优先搜素算法

文章讲述了BFS(广度优先搜索)在解决寻找两个岛屿间最短桥梁问题中的应用,以及在单词接龙问题中如何优化从起始单词到目标单词的最短路径。最初使用双向BFS+DFS导致超时,改进后通过反向DFS从目标单词开始搜索,显著提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、BFS

bfs一层一层地遍历图或树,一般用队列实现,可以计算距离目标的步数。

 

二、例题

1)

力扣icon-default.png?t=N4P3https://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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值