1020. 飞地的数量(leetcode)

1020. 飞地的数量

class Solution {
    int[] dx={0,1,0,-1};
    int[] dy={1,0,-1,0};
    int n;
    int m;
    int[][] grid;
    boolean[][] vis;
    int res;
    public int numEnclaves(int[][] grid) {
        // flood fill
        // 思路:从边缘的1搜索联通块,将其标记成0,表示不可达,再统一计数
        m=grid.length;
        n=grid[0].length;
        vis=new boolean[m][n];
        this.grid=grid;
        for(int i=0;i<grid.length;i++)
            for(int j=0;j<grid[i].length;j++)
            {
                // 搜索边界的1
                if(i!=0 && i!=m-1 && j!=0 && j!=n-1) continue ;
                if(grid[i][j]==1 && vis[i][j]==false)
                {
                    dfs(i,j);
                }
            }
        for(int i=0;i<grid.length;i++)
            for(int j=0;j<grid[i].length;j++)
                if(grid[i][j]==1)res++;
        return res;
    }

    void dfs(int x,int y)
    {
        vis[x][y]=true;
        grid[x][y]=0;
        for(int i=0;i<4;i++)
        {
            int a=dx[i]+x,b=dy[i]+y;
            if(a>=0 && b>=0 && a<m && b<n && vis[a][b]==false && grid[a][b]==1)
            {
                dfs(a,b);
            }
        }
    }
}

 

posted @ 2024-10-08 03:57  风乐  阅读(2)  评论(0编辑  收藏  举报