力扣原题
思路:从(0,0)位置出发,开始扫描直到出现第一个陆地区域块(即grid数组该位置为1),然后从该点开始进行dfs搜索,每搜索到一个陆地块就标为true并且计数器+1,直到周围所有块都是水域,返回。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int d[4][2]={0, 1, 1, 0, -1, 0, 0, -1};
int cnt;//存储每个岛屿的面积
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& tag,int x,int y)
{
if(tag[x][y]||grid[x][y]==0)return;//遍历过或者是水域就返回
tag[x][y]=true;//标记为访问过
cnt++;//岛屿面积+1
for(int k=0;k<4;k++)//遍历当前陆地块上下左右四个方向
{
int nextx=x+d[k][0];
int nexty=y+d[k][1];
//越界直接跳过
if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())continue;
dfs(grid,tag,nextx,nexty);
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
vector<vector<int>> grid={{0,0,0,0,0}};
int m=grid.size(),n=grid[0].size();
vector<vector<bool>> tag(m,vector<bool>(n,false));//定义标记数组
vector<int> area;//存储所有岛屿的面积
area.push_back(0);//处理没有岛屿的情况
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(!tag[i][j]&&grid[i][j]==1)
{
cnt=0;//访问岛屿的第一小块,初始化面积为0
dfs(grid,tag,i,j);
area.push_back(cnt);//搜索完整块岛屿,保存岛屿面积
}
}
}
sort(area.begin(),area.end());//排序,取最大值
cout <<area[area.size()-1];
return 0;
}