1020、飞地的数量

leetcode题库1020飞地的数量

题目如下

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

 

 

思路

首先我们知道,靠近表格边界的陆地一定不是飞地,所以我们找到所有靠近边界的陆地,开始深度优先遍历,将遍历到的陆地都置为0,最后遍历整个单元格,查找陆地的数量,即为飞地的数量。

代码如下

package LeetCode;

//1020.飞地的数量
public class NumEnclaves {
    public static void main(String[] args) {
        NumEnclaves Num=new NumEnclaves();
        int[][] grid = {{0, 1, 0, 0},
                        {1, 0, 1, 0},
                        {0, 1, 0, 0},
                        {1, 0, 0, 1}};
        int ans = Num.numEnclaves(grid);
        System.out.println(ans);
    }
    private int m;
    private int n;
    private int[][] dirs = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
    private int ans=0;
    public int numEnclaves(int[][] grid) {
        m= grid.length;
        n = grid[0].length;
        //遍历边界的单元格
        for (int i = 0; i < m; i++) {
            DFS(grid, i, 0);
            DFS(grid, i, n - 1);
        }
        for (int j = 1; j < n-1; j++) {
            DFS(grid, 0, j);
            DFS(grid, m - 1, j);
        }
        //遍历查找修改完的所有的单元格,剩下的单元格是1则飞地加1
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    ans++;
                }
            }
        }
        return ans;
    }
//深度优先遍历
    private void DFS(int[][] grid, int i, int j) {
        if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j]==0) {
            return;
        }
        //找到陆地,置为0
        grid[i][j]=0;
        //查找陆地是否有紧挨的陆地
        for (int[] Dirs : dirs) {
            DFS(grid,i+Dirs[0],j+Dirs[1]);
        }
    }
}
posted @ 2022-02-24 21:04  彬不冰  阅读(41)  评论(0)    收藏  举报