1.题目:

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

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

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

 

示例 1:

LeetCode 1020.飞地的数量_i++

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

示例 2:

LeetCode 1020.飞地的数量_i++_02

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



2.代码:

dfs:

class Solution {
    int[][] move = {{0,1},{0,-1},{1,0},{-1,0}};
    int count=0;
    public int numEnclaves(int[][] grid) {
        for(int i=0;i<grid.length;i++){
            if(grid[i][0]==1){
                dfs(grid,i,0);
            }
            if(grid[i][grid[0].length-1]==1){
                dfs(grid,i,grid[0].length-1);
            }
        }
        for(int j=1;j<grid[0].length-1;j++){
            if(grid[0][j]==1){
                dfs(grid,0,j);
            }
            if(grid[grid.length-1][j]==1){
                dfs(grid,grid.length-1,j);
            }
        }
        count=0;
        for(int i=1;i<grid.length-1;i++){
            for(int j=1;j<grid[0].length-1;j++){
                if(grid[i][j]==1){
                    dfs(grid,i,j);
                }
            }
        }
        return count;
    }
    public void dfs(int[][] grid,int x,int y){
        if(grid[x][y]==0) return;
        grid[x][y]=0;
        count++;
        for(int i=0;i<move.length;i++){
            int m=x+move[i][0];
            int n=y+move[i][1];
            if(m<0||n<0||m>=grid.length||n>=grid[0].length||grid[m][n]==0) continue;
            dfs(grid,m,n);
        }
    }
}


bfs:

class Solution {
    int[][] move = {{0,1},{0,-1},{1,0},{-1,0}};
    int count=0;
    public int numEnclaves(int[][] grid) {
        for(int i=0;i<grid.length;i++){//把左右两边的1变成0
            if(grid[i][0]==1){
                bfs(grid,i,0);
            }
            if(grid[i][grid[0].length-1]==1){//注意这里的宽度是grid[0].length
                bfs(grid,i,grid[0].length-1);
            }
        }
        for(int j=1;j<grid[0].length-1;j++){//把上下两边的1变成0 注意之前重复的不用变了
            if(grid[0][j]==1){
                bfs(grid,0,j);
            }
            if(grid[grid.length-1][j]==1){//注意这里的是长度grid.length-1
                bfs(grid,grid.length-1,j);
            }
        }
        count=0;//计算的也算是总面积
        for(int i=1;i<grid.length-1;i++){
            for(int j=1;j<grid[0].length-1;j++){
                if(grid[i][j]==1){
                    bfs(grid,i,j);
                }
            }
        }
        return count;
    }
    public void bfs(int[][] grid,int x,int y){
       Queue<Integer> queue = new LinkedList<>();
       queue.offer(x);
       queue.offer(y);
       count++;
       grid[x][y]=0;
       while(!queue.isEmpty()){//注意这个判断条件不要忘记了
            int m1 = queue.poll();
           int n1=queue.poll();
 for(int i=0;i<move.length;i++){
          int m=m1+move[i][0];//注意这里要重新用变量,不要直接用抛出来的
           int n=n1+move[i][1];
           if(n<0||m<0||m>=grid.length||n>=grid[0].length||grid[m][n]==0) continue;
          if(grid[m][n]==1){
              queue.offer(m);
              queue.offer(n);
              count++;
              grid[m][n]=0;
          }
       }
       }
      
    }
}