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++){// 搜索边界的1if(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);}}}
}