方法一:dfs深度优先遍历

题中岛屿是相互连接的1组成的,而要判断岛屿个数就需要挨个遍历,为防止多个1重复判断,就要把与当前1相邻的所有1都设为0,在判断某个方向是否为1时,又要再往下判断其相邻的情况,在遍历完所有相邻的情况后,再回溯,因此用到深度遍历递归调用的方法。

步骤:

  1. 首先,判断矩阵是否为空。
  2. 然后,遍历矩阵,判断是否为1,是则计数加一,再调用dfs函数。
  3. dfs函数中,先将i,j位置设为0,再判断相邻的位置是否为1,是则递归调用dfs。
import java.util.*;
public class Solution {
    public void dfs(char[][] grid,int i,int j){
        int n=grid.length;
        int m=grid[0].length;
        grid[i][j]='0';
        if(i-1>=0&&grid[i-1][j]=='1'){
            dfs(grid,i-1,j);
        }
        if(i+1<n&&grid[i+1][j]=='1'){
            dfs(grid,i+1,j);
        }
        if(j-1>=0&&grid[i][j-1]=='1'){
            dfs(grid,i,j-1);
        }
        if(j+1<m&&grid[i][j+1]=='1'){
            dfs(grid,i,j+1);
        }
    }
    public int solve (char[][] grid) {
        if(grid.length==0){
            return 0;
        }
        int count=0;
        for(int i=0;i<grid.length;++i){
            for(int j=0;j<grid[0].length;++j){
                if(grid[i][j]=='1'){
                    count++;
				  //调用dfs函数将其相邻且为1的位置都置为0.
                    dfs(grid,i,j);
                }
            }
        }
        return count;
    }
}