leedcode 827. 最大人工岛 (洪水填充)

测试链接:https://leetcode.cn/problems/making-a-large-island/

思路:

先用洪水填充给每个岛屿进行编号,以便最后答案更新区分,设置一个used[]数组,用来避免更新答案时候算了重复的岛屿,为了避免全图都为陆地的特殊情况,我们在进行岛屿编号的时候,先更新答案为最大岛屿的面积,接着遍历每个海水的点,计算周围岛屿的面积之和,更新答案,记得加上该点本身的面积,所以初始化ans1=1

题解:

const int N=3e5;
class Solution {
public:
    int ans=0;
    int dir[4][2]={1,0,-1,0,0,1,0,-1};
    int cursize[N];
    bool used[N];
    int n,m;
    int id=1;
    void dfs(int i,int j,vector<vector<int>>&grid)
    {
        grid[i][j]=id;
        cursize[id]++;
        for(int k=0;k<4;k++)
        {
            int x = i+dir[k][0];
            int y = j+dir[k][1];
            if(x<0||x>=n||y<0||y>=m||grid[x][y]!=1)continue;
            dfs(x,y,grid);
        }


    }

    int largestIsland(vector<vector<int>>& grid) {
        n = grid.size();
        m = grid[0].size();
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
               
                if(grid[i][j]==1)
                {
                    id++;
                    dfs(i,j,grid);
                }
                ans = max(ans,cursize[id]);
            }
        }

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)cout<<grid[i][j];
            cout<<endl;
        }

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i][j]==0)
                {
                    int ans1=1;
                    for(int k=0;k<4;k++)
                    {
                        int x = i+dir[k][0];
                        int y = j+dir[k][1];
                        if(x<0||x>=n||y<0||y>=m||grid[x][y]==0||used[grid[x][y]])continue;
                        used[grid[x][y]]=true;
                        ans1+=cursize[grid[x][y]];
                    }
                    for(int k=0;k<4;k++)
                    {
                        int x = i+dir[k][0];
                        int y = j+dir[k][1];
                        if(x<0||x>=n||y<0||y>=m||grid[x][y]==0)continue;
                        used[grid[x][y]]=false;
                    }
                    ans=max(ans,ans1);
                }
            }
        }
        return ans;
    }
};
posted @ 2025-07-14 10:26  屈臣  阅读(16)  评论(0)    收藏  举报