优选算法_岛屿数量_floodfill算法)_bfs_C++

一.题目解析

遍历整个二维数组,看有多少单独的连通域

算法解析:floodfill算法

1.遍历整个数组,遇到一个单独的连通域就使用bfs并且标记已经遍历的位置

2.bfs时是遍历上下左右,遍历时没有改变性质就会重复遍历死循环

比较考验代码能力,就是bfs时要做什么(边遍历边改true)等,结合代码给出注释.

二.代码编写:

cpp 复制代码
class Solution {
    int dx[4]={0,0,-1,1};
    int dy[4]={1,-1,0,0};
    int vis[301][301];
    int m,n;
public:
    int numIslands(vector<vector<char>>& grid) {
        m=grid.size(),n=grid[0].size();//边界长度,采用的是全局变量
        memset(vis,false,sizeof(vis));//初始化判断数组为false
        int ret=0;//记录岛屿数量
        for(int i=0;i<m;i++)//遍历整个数组
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]=='1'&&!vis[i][j])//遇到一个未遍历的岛屿,采用bfs看看岛屿多大,并标记为true已遍历
                {
                    ret++;//计数
                    bfs(grid,i,j);//bfs
                }
            }
        }
        return ret;
    }

    void bfs(vector<vector<char>>& grid,int i,int j)
    {
        queue<pair<int,int>>q;//队列来实现宽度优先遍历
        q.push({i,j});//岛屿的第一个坐标入队
        vis[i][j]=true;//标记已遍历

        while(!q.empty())//这个岛屿的其他坐标入队
        {
            auto [a,b]=q.front();
            q.pop();           
            for(int k=0;k<4;k++)//遍历四个方向
            {
                int x=a+dx[k],y=b+dy[k];//四个方向
                if(x>=0&&x<m && y>=0&&y<n && grid[x][y]=='1'&&!vis[x][y])
                //四个方向都不能越界,并且要没有遍历过,符合已知性质
                {
                    q.push({x,y});//符合入队
                    vis[x][y]=true;//标记已遍历
                }
            }
        }
    }
};

我们创建的是反向数组,通过迭代就可以实现遍历四个方向.

相关推荐
oort1231 分钟前
VLStream 全开源决策式 AI 视频平台 技术视角完整说明
大数据·开发语言·人工智能·经验分享·python·开源·音视频
Cloud_Shy6182 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第二章 Item 10 - 12)
c语言·开发语言·网络·人工智能·windows·python·编辑器
cpp_25012 分钟前
P10109 [GESP202312 六级] 工作沟通
数据结构·c++·算法·题解·洛谷·gesp六级
BossFriday2 分钟前
【手撸IM】SycllaDB 消息存储基础
java·分布式·中间件
吴可可1232 分钟前
CAD二次开发中多段线定点分割技巧
算法
霸道流氓气质3 分钟前
导入历史跟踪机制实战指南
java·linux·服务器
Xeon_CC3 分钟前
vs2026远程开发debian12容器的C++程序笔记
开发语言·c++·笔记
逻极3 分钟前
Redis 从入门到精通:缓存设计与实战
数据结构·redis·缓存·哨兵集群
日取其半万世不竭4 分钟前
Uptime Kuma 应该放哪台机器?
java·docker·容器·https
消失的旧时光-19434 分钟前
Kotlin 协程设计思想(四):launch、async、withContext 到底有什么区别?
java·kotlin·async·launch·withcontext·deferred