leetcoce 1020. 飞地的数量


给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。

移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。

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

示例 1:

输入:[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:
有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:

输入:[[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:
所有 1 都在边界上或可以到达边界。
 

提示:

1 <= A.length <= 500
1 <= A[i].length <= 500
0 <= A[i][j] <= 1
所有行的大小都相同

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-enclaves
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1:采用回溯。

2:先把四周的都是1的,并且关联的1都设置为0。

3:遍历二维数组,统计1出现的次数。

    private int[][] grid;
    private int a;
    private int b;
    public int numEnclaves(int[][] grid) {
        this. a = grid.length;
        this. b = grid[0].length;
        this.grid = grid;
        for (int i = 0; i < b; i++) {
            find(0, i);
            find(a - 1, i);
        }
        for (int i = 0; i < a; i++) {
            find(i, 0);
            find(i, b - 1);
        }
        int count = 0;
        for (int i = 1; i < a - 1; i++) {
            for (int j = 1; j < b - 1; j++) {
                if (grid[i][j] == 1) {
                    count++;
                }
            }
        }
        return count;
    }

    private void find (int x, int y) {
        if (x < 0 || x == a || y < 0 || y == b || grid[x][y] == 0) {
            return;
        }
        grid[x][y] = 0;
        find(x + 1, y);
        find(x - 1, y);
        find(x, y + 1);
        find(x, y - 1);
    }