算法日常・每日刷题--<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;
    }
};
相关推荐
zyl7652 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖6 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌6 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F6 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_307779136 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang03227 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!7 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
2501_926978337 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师7 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
无定义_7 小时前
10.11日常训练
算法