一.题目解析

一个群岛在一片海上,找出面积最大的岛屿,如图,红色区域最大

算法解析:floodfill算法+bfs
遍历整个数组,每次遍历到一个新岛屿边缘,用bfs遍历看岛屿的面积有多大,并且将未遍历的位置vis[x][y]=true;
考验代码能力,结合代码进行理解
二.代码编写
cpp
class Solution {
int dx[4]={0,0,1,-1};//方向偏移数组
int dy[4]={1,-1,0,0};
bool vis[50][50];//判断是否遍历的数组
int m,n;
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
m=grid.size(),n=grid[0].size();
memset(vis, 0, sizeof(vis)); // 初始化 vis
int ret=0;
for(int i=0;i<m;i++)//遍历整个数组
{
for(int j=0;j<n;j++)
{
if(grid[i][j]==1&&vis[i][j]==false)ret=max(bfs(grid,i,j),ret);
//满足固定性质并且是没有遍历过的位置
}
}
return ret;
}
int bfs(vector<vector<int>>& grid,int i,int j)//bfs看数组的大小
{
queue<pair<int,int>>q;//队列实现bfs
q.push({i,j});
vis[i][j]=true;//将已经遍历的位置标记
int curret=1;
while(!q.empty())
{
auto [a,b]=q.front();
q.pop();
for(int k=0;k<4;k++)//四个方向遍历
{
int x=a+dx[k],y=b+dy[k];
if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&vis[x][y]==false)curret++,q.push({x,y}),vis[x][y]=true;
//不越界,满足某一性质,没有遍历的位置
}
}
return curret;//返回当前岛屿大小
}
};