1020. 飞地的数量(leetcode)
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);
}
}
}
}