深度优先遍历DFS
目标是找到矩阵中 “岛屿的数量” ,上下左右相连的 1 都被认为是连续岛屿。
dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。
从 (i, j) 向此点的上下左右 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 做深度搜索。
终止条件:
(i, j) 越过矩阵边界;
grid[i][j] == 0,代表此分支已越过岛屿边界。
搜索岛屿的同时,执行 grid[i][j] = '0',即将岛屿所有节点删除,以免之后重复搜索相同岛屿。
class Solution {
void fun(char[][]arr,int r,int c){
int nx=arr.length;
int ny=arr[0].length;
if(r<0 || c<0 || r>=nx || c>=ny || arr[r][c]=='0'){
return;
}
//将与之相连的位置“烧光”为0
arr[r][c]='0';
fun(arr,r-1,c);
fun(arr,r+1,c);
fun(arr,r,c+1);
fun(arr,r,c-1);
}
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nx=grid.length;
int ny=grid[0].length;
int num=0;
//遍历海域
for(int i=0;i<nx;i++){
for(int j=0;j<ny;j++){
//找到小岛位置
if(grid[i][j]=='1'){
num++;
fun(grid,i,j);
}
}
}
return num;
}
}