827. 最大人工岛
题目链接:827. 最大人工岛
代码如下:
class Solution
{
public:
int largestIsland(vector<vector<int>>& grid)
{
unordered_map<int,int> gridNum;
int n=grid.size(), m = grid[0].size();
bool isAllGrid=true;// 标记是否整个地图都是陆地
vector<vector<bool>> visited(n,vector<bool>(n,false));
int mark=2;//每座岛的标记
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]==0) isAllGrid=false;
if(!visited[i][j]&&grid[i][j]==1)
{
count=0;
dfs(grid,visited,i,j,mark);
gridNum[mark]=count;
mark++;
}
}
}
if(isAllGrid) return n*m;
int res=0;
unordered_set<int> visitedGrid;//标记访问过的岛屿
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int count=1;//记录连接之后的岛屿数量
visitedGrid.clear();
if(grid[i][j]==0)
{
for(int k=0;k<4;k++)
{
int neari=i+dir[k][1];
int nearj=j+dir[k][0];
if(neari<0||neari>=n||nearj<0||nearj>=m) continue;
if(visitedGrid.count(grid[neari][nearj])) continue;//添加过的岛屿不要重复添加
count+=gridNum[grid[neari][nearj]];
visitedGrid.insert(grid[neari][nearj]);
}
}
res=max(res,count);
}
}
return res;
}
private:
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
int count;
//深度优先遍历
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y,int mark)
{
if(visited[x][y]||grid[x][y]==0) return;
visited[x][y]=true;// 标记访问过
grid[x][y]=mark;// 给陆地标记新标签
count++;
for(int i=0;i<4;i++)
{
int nextX=x+dir[i][0],nextY=y+dir[i][1];
//越界
if(nextX<0||nextX>=grid.size()||nextY<0||nextY>=grid[0].size())
continue;
dfs(grid,visited,nextX,nextY,mark);
}
}
};