力扣 ------   200. 岛屿数量       难度:中等

原题链接


  给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。


示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例2:

输入:
11000
11000
00100
00011

输出: 3


理解题意:

    他的意思是,给我们一个二维字符数组,让我们找出其中一个有多少块,每一块的定义呢,是在上下左右四个方向都没有陆地,就是被水包围。

   

解题思路:

      我们可以利用暴搜思想,去无情遍历,把所有的块都变成“2”,我们暂且称这一行为为感染吧。那我们的解题思路就是,首先去循环遍历这个二维字符串数组,在其中进行递归,我们判断四个方向,如果是“1”即陆地,那我们把它感染,变成“2”,直到所有和这一块相连的陆地全部被感染。我们递归的结束条件就很简单,满足两个要求,

 1.不越界 ; 

 2.不是未感染的陆地(包括海水和感染过的陆地);

那我们们的num ++;


题解:

class Solution {
    private char[][] grid;
    public int numIslands(char[][] grid) {
            this.grid = grid;
            int num = 0;
            for(int i = 0 ; i < this.grid.length ; i ++) {
                for(int j = 0 ; j < this.grid[i].length ; j ++) {
                    if(grid[i][j] == '1') {
                        Infectlands(i , j);
                        num ++;
                    }
                }
            }
            //System.out.println(num);
            return num;
        }
        
        public int Infectlands(int i,int j ) {
            //结束条件
            if(i < 0 || i >= grid.length || j < 0 || j >= grid[i].length || grid[i][j] != '1') {
                return 0;
            }
            grid[i][j] = '2';  //感染
            Infectlands(i + 1 , j);
            Infectlands(i , j + 1);
            Infectlands(i - 1 , j);
            Infectlands(i , j - 1);
            return 1;
        }
}