分析:考察的数据结构是二位数组,考察的算法是dfs 或者 bfs。但是bfs 要用队列来存临时数据,一般还是 dfs 用得比较多,全部交给机器。
哈哈,这两个是以前我最怕的,没想到现在处理起来这么从容,是写得最快的。

首先要理解 dfs 和 bfs 的含义,并不是刻板的一个算法模板,而是一个算法的思路,。dfs 在 树的遍历里面提到过,这里在图里面也是提到过,在不同的地方都有什么目的。很明显就是一句话,不停的尝试,不恰当的说法就是吃着碗里的还想着锅里的,直到锅里没东西了再回溯遍历其他路径。

所以在这里有一个比较出名的图遍历的着色法,但是这里恰恰是把图都着色好了,要计算有多少小岛。很明显这里要找到n个遍历起点,每一次我们都把小岛能遍历的地方都走一遍并标记,找到了n个起点就说明有 n个小岛。

public int solve (char[][] grid) {
    // write code here
    if(grid==null || grid.length==0){
        return 0;
    }
    int m=grid.length;
    int n=grid[0].length;
    int res=0;
    for(int x=0;x<m;x++){
        for(int y=0;y<n;y++){
            if(grid[x][y]=='1'){
                dfs(grid,x,y,m,n);//找到一个起点就深挖,把与这个起点有连接的点全都玷污一遍
                res+=1; //记录小岛个数
            }
        }
    }
    return res;
}
public void dfs(char [][] grid,int x,int y,int m,int n){
    if(x>=0&&x<m &&y>=0&& y<n){ //在界内,要是越界就说明到头了
        if(grid[x][y]=='1'){
            grid[x][y]='0';//直接在原数组上操作更新方便判断,直接标记这里遍历过了,后面就是上下左右开始遍历了
            dfs(grid,x+1,y,m,n);
            dfs(grid,x-1,y,m,n);
            dfs(grid,x,y+1,m,n);
            dfs(grid,x,y-1,m,n);
        }
    }else{
        return;
    }
}