题目描述
给定一个由 0 和 1 组成的非空二维数组 grid,用来表示海洋岛屿地图。 一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 找到给定的二维数组中最大的岛屿面积 。如果没有岛屿,则返回面积为 0。
连通规则:4 连通(上下左右),斜向不算相邻
解题思路
- 方向数组
dx、dy枚举上下左右 4 个方向,简化坐标偏移代码; vis访问标记数组,防止重复统计同一块陆地;- 双重循环遍历网格每个格子:
- 如果当前格子是陆地
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;
}
};