给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。
一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。
返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
这是一道典型的dfs题,这里首先要确定拿到哪几个方向的深度优先;
for(int j=0;j<n;j++){
dfs(grid,0,j);
dfs(grid,m-1,j);
}
for(int i=0;i<m;i++){
dfs(grid,i,0);
dfs(grid,i,n-1);
}
这里用dfs函数去拿到四个方向里所有边界的元素,这时候就要套dfs模板进行赋值函数,
void dfs(int[][]grid,int i,int j){
int m=grid.length,n=grid[0].length;
if(i<0||j<0||i>=m||j>=n||grid[i][j]==0){
return;
}
grid[i][j]=0;
dfs(grid,i+1,j);
dfs(grid,i,j+1);
dfs(grid,i-1,j);
dfs(grid,i,j-1);
}//固定模板利用dfs i+1,i,i-1,j,j+1,j-1进行深度四个方向的遍历,需要套用dfs函数进行求解,上面的if为这个题的限制条件.
做到这里,只要用上面的
int res=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
res++;
}
}
}统计一下遍历为陆地面积的个数即可.