一.题目

二.思路讲解
2.1 思路讲解
本题与 DFS 解法 的思路完全一致,只是将深度优先替换广度优先搜索(BFS)。
-
遍历整个网格,每遇到一个未访问的陆地 (
1),就启动 BFS,用一个队列来扩散。 -
将起点入队并标记,然后不断取出队头,向四个方向探索,若发现相邻的陆地且未访问,则立即将其入队并标记,同时累加当前岛屿的面积。
三.代码演示
四.代码讲解
一、全局变量与数据结构
-
bx[4]、by[4]:方向数组,表示上下左右四个方向的偏移量。 -
check[51][51]:整型数组,用于标记格子是否已被访问(0 表示未访问,1 表示已访问)。 -
typedef pair<int,int> PII:简化坐标类型的书写。 -
row、col:成员变量,存储网格的行数和列数。
二、主函数 maxAreaOfIsland
-
获取网格尺寸
row、col。 -
初始化结果变量
ret = 0。 -
双重循环遍历整个网格:
- 若当前格子是陆地(
grid[i][j] == 1)且未被访问(!check[i][j]),则调用bfs(grid, i, j)计算该岛屿的面积,并更新ret为最大值。
- 若当前格子是陆地(
-
返回最大岛屿面积
ret。
三、BFS 函数 bfs
bfs(grid, i, j) 以 (i, j) 为起点,通过广度优先搜索计算该连通岛屿的面积,并标记所有已访问格子。执行流程如下:
-
初始化:
-
当前面积
cur = 1(包含起点)。 -
创建队列
q,将起点(i, j)入队,并立即标记check[i][j] = true。
-
-
循环处理:当队列非空时:
-
取出队头坐标
(a, b)(使用auto [a, b] = q.front(); q.pop();)。 -
遍历四个方向,计算新坐标
(x, y)。 -
若新坐标在网格范围内、未被访问、且是陆地(
grid[x][y] == 1),则:-
面积
cur++。 -
标记
check[x][y] = true。 -
将
(x, y)入队。
-
-
-
返回面积
cur。
四、关键细节
- 面积统计 :
cur初始为 1 对应起点,之后每发现一个新陆地就累加,最终得到岛屿总面积。
五、流程图
