算法日常・每日刷题--<BFS>3

200. 岛屿数量 - 力扣(LeetCode)200. 岛屿数量 - 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。 示例 1:输入:grid = \['1','1','1','1','0', '1','1','0','1','0', '1','1','0','0','0', '0','0','0','0','0']输出:1示例 2:输入:grid = \['1','1','0','0','0', '1','1','0','0','0', '0','0','1','0','0', '0','0','0','1','1']输出:3 提示: * m == grid.length * n == gridi.length * 1 <= m, n <= 300 * gridij 的值为 '0' 或 '1'https://leetcode.cn/problems/number-of-islands/

题目描述

给定一个由 0 和 1 组成的非空二维数组 grid,用来表示海洋岛屿地图。 一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 找到给定的二维数组中最大的岛屿面积 。如果没有岛屿,则返回面积为 0。

连通规则:4 连通(上下左右),斜向不算相邻

解题思路

  1. 方向数组 dx、dy 枚举上下左右 4 个方向,简化坐标偏移代码;
  2. vis 访问标记数组,防止重复统计同一块陆地;
  3. 双重循环遍历网格每个格子:
    • 如果当前格子是陆地1且未访问,启动一次 BFS;
    • BFS 遍历整块连通岛屿,统计当前岛屿土地数量(面积);
cpp 复制代码
class Solution {
public:
int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};

    bool vis[50][50];
    int m,n;
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m=grid.size();
        n=grid[0].size();
        int count=0,ret=0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1&&!vis[i][j])
                {
                    
                    count=bfs(grid,i,j);
                    if(count>=ret)
            ret=count;
                }
            }
            

        }
        return ret;
    }

    int bfs(vector<vector<int>>& grid,int i,int j)
    {
        queue<pair<int ,int>>q;
        q.push({i,j});
        vis[i][j]=true;
            int sum=0;

        while(q.size())
        {
            auto [a,b]=q.front();
            q.pop();
                sum++;

            for(int k=0;k<4;k++)
            {
                int x=a+dx[k];
                int 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;
                }
            }
        }
        return sum;
    }
};
相关推荐
hold?fish:palm7 小时前
44 二叉搜索树中第K小的元素
开发语言·c++·算法
Chen—LSN7 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
anew___7 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
Chen—LSN8 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
程序员yu8 小时前
会编网络:别被入门教程骗了,Python实用能力不在语法本身
开发语言·python·学习·算法
Allen_LVyingbo9 小时前
信息化部门在AI时代的编程转移路径分析(上)
人工智能·python·算法·健康医疗·数据库开发·时序数据库·数据库架构
七牛云行业应用9 小时前
Jev 报 401 / api_key_required 怎么解决:TypeSafe AI 官方错误码表与排查步骤
算法·github
晴天的雨.9929 小时前
【C++算法】三数之和
开发语言·c++·算法
多多爱学习10 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试
续写烂尾11 小时前
MK SD NAND(贴片式TF卡)替代Nor Flash:1Gb容量与256Mb Nor
算法·microsoft