岛屿个数-BFS

本文详细解析了LeetCode上的一道经典题目——岛屿数量,通过广度优先搜索(BFS)策略,介绍了一种有效的算法来计算二维矩阵中由'1'(陆地)组成的独立岛屿的数量。文章深入探讨了算法的实现细节,包括如何遍历矩阵、标记已访问的陆地以及如何利用队列进行探索。
摘要由CSDN通过智能技术生成

题目(来源于leetcode):
在这里插入图片描述
思路。每次找出与一个陆地相邻的所有陆地。知道一个队列出现空,ans+1。
代码:

class Solution {
public:
    vector<vector<char>> grid;
    queue<pair<int,int>>que;
    
    //判断是否为合法陆地
    bool isIsland(int x,int y){
        return 0<=x && x<grid.size()
            && 0<=y && y<grid[0].size()//在边界内
            && grid[x][y]=='1';//值为1
    }
    
    //将陆地旁边的陆地放入探索队列(上下左右四个方向)
    void checkAndEnqueue(int x,int y){
        if(isIsland(x-1,y)) que.push(make_pair(x-1,y));
        if(isIsland(x+1,y)) que.push(make_pair(x+1,y));
        if(isIsland(x,y-1)) que.push(make_pair(x,y-1));
        if(isIsland(x,y+1)) que.push(make_pair(x,y+1));
    }
    
    int numIslands(vector<vector<char>>& grid) {
        this->grid=grid;
        if(grid.empty()) return 0;
        int m=grid.size(),n=grid[0].size(),ans=0;//给定地图的长宽
        
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                //第一次碰到陆地
                if(grid[i][j]=='1'){
                    que.push(make_pair(i,j));//将此点入队列
                    ans++;
                    
                    //探索此岛屿所有相连的陆地
                    while(!que.empty()){
                        pair<int,int> root=que.front();
                        que.pop();//队列首出队
                        int x=root.first,y=root.second;
                        if(grid[x][y]=='0')continue;//为零直接出队
                        //标记为已探索
                        grid[x][y]='0';
                        //将相连的陆地放入探险队列
                        checkAndEnqueue(x,y);
                    }
                }
            }
        }
        return ans;

    }
};
BFS(宽度优先搜索)通常用于图论中的遍历算法,特别是在寻找连通分量、路径或最小生成树等问题时。在查找岛屿的数量时,你可以将其视为一个二维网格,其中'0'表示水域,'1'表示陆地。岛屿就是由相邻的陆地区域组成的,且四周边界也是陆地。 这里是一个简单的C++实现,使用BFS来计算字符串表示的二维数组中岛屿的数量: ```cpp #include <iostream> #include <queue> #include <string> int countIslands(const std::string& grid) { int m = grid.size(), n = grid[0].size(); int islands_count = 0; bool visited[m][n]; // 初始化为未访问 for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) visited[i][j] = false; // 定义队列并开始 BFS std::queue<std::pair<int, int>> q; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == '1' && !visited[i][j]) { islands_count++; q.push({i, j}); visited[i][j] = true; } } } while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); // 检查上下左右四个方向 if (x > 0 && grid[x - 1][y] == '1' && !visited[x - 1][y]) q.push({x - 1, y}), visited[x - 1][y] = true; if (x < m - 1 && grid[x + 1][y] == '1' && !visited[x + 1][y]) q.push({x + 1, y}), visited[x + 1][y] = true; if (y > 0 && grid[x][y - 1] == '1' && !visited[x][y - 1]) q.push({x, y - 1}), visited[x][y - 1] = true; if (y < n - 1 && grid[x][y + 1] == '1' && !visited[x][y + 1]) q.push({x, y + 1}), visited[x][y + 1] = true; } return islands_count; } int main() { std::string grid = "010010000010"; int islandCount = countIslands(grid); std::cout << "Number of islands: " << islandCount << std::endl; return 0; } ``` 在这个代码里,我们首先初始化一个`visited`数组记录每个位置是否已被访问过。然后,对每个格子进行检查,如果它是陆地且还未被访问,则标记为已访问,并增加岛屿计数。接着,我们用队列进行广度优先搜索,每次从队列中取出一个位置,然后在其周围四邻位置上重复此过程,直到所有可达的陆地都被处理过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值