《LeetCode 695 岛屿的最大面积 FloodFill BFS解法》

一.题目

695. 岛屿的最大面积 - 力扣(LeetCode)

二.思路讲解

2.1 思路讲解

本题与 DFS 解法 的思路完全一致,只是将深度优先替换广度优先搜索(BFS)

  • 遍历整个网格,每遇到一个未访问的陆地1),就启动 BFS,用一个队列来扩散。

  • 将起点入队并标记,然后不断取出队头,向四个方向探索,若发现相邻的陆地且未访问,则立即将其入队并标记,同时累加当前岛屿的面积。

三.代码演示

四.代码讲解

一、全局变量与数据结构
  • bx[4]by[4]:方向数组,表示上下左右四个方向的偏移量。

  • check[51][51]:整型数组,用于标记格子是否已被访问(0 表示未访问,1 表示已访问)。

  • typedef pair<int,int> PII:简化坐标类型的书写。

  • rowcol:成员变量,存储网格的行数和列数。

二、主函数 maxAreaOfIsland
  1. 获取网格尺寸 rowcol

  2. 初始化结果变量 ret = 0

  3. 双重循环遍历整个网格:

    • 若当前格子是陆地(grid[i][j] == 1)且未被访问(!check[i][j]),则调用 bfs(grid, i, j) 计算该岛屿的面积,并更新 ret 为最大值。
  4. 返回最大岛屿面积 ret

三、BFS 函数 bfs

bfs(grid, i, j)(i, j) 为起点,通过广度优先搜索计算该连通岛屿的面积,并标记所有已访问格子。执行流程如下:

  1. 初始化

    • 当前面积 cur = 1(包含起点)。

    • 创建队列 q,将起点 (i, j) 入队,并立即标记 check[i][j] = true

  2. 循环处理:当队列非空时:

    • 取出队头坐标 (a, b)(使用 auto [a, b] = q.front(); q.pop();)。

    • 遍历四个方向,计算新坐标 (x, y)

    • 若新坐标在网格范围内、未被访问、且是陆地(grid[x][y] == 1),则:

      • 面积 cur++

      • 标记 check[x][y] = true

      • (x, y) 入队。

  3. 返回面积 cur

四、关键细节
  • 面积统计cur 初始为 1 对应起点,之后每发现一个新陆地就累加,最终得到岛屿总面积。

五、流程图