岛屿数量-LeetCode

题目描述

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

示例1:

输入 :

[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]

输出:1

示例2:

输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3

思路:深度优先搜索

对每一个可能的元素(input[m][n]==1)深入(上下左右方位)到不能再深入为止(一步步递归进行),而且每个节点只能访问一次。

为什么要进行向左和向上的搜索呢?因为在递归时,走到了右面(倒T型道路右面)所以要向上,走到了的下面(T型道路下面)要向左。

public class Main {public int numIslands(char[][] grid) {
        if (grid.length == 0) return 0;
        int count = 0;
        boolean[][] isVisited = new boolean[grid.length][grid[0].length];
        for (int m = 0; m < grid.length; m++) {
            for (int n = 0; n < grid[0].length; n++) {
                if (grid[m][n] == '1' && isVisited[m][n] == false) {
                    deepSearch(m, n, grid, isVisited);
                    count++;
                }
            }
        }
        return count;
    }

    private void deepSearch(int m, int n, char[][] grid, boolean[][] isVisited) {
        isVisited[m][n] = true;
        if ( n+1 < grid[0].length){
            if (grid[m][n + 1] == '1' && isVisited[m][n + 1] == false) {
                deepSearch(m, n + 1, grid, isVisited);
            }
        }

        if ( n-1 > -1){
            if (grid[m][n - 1] == '1' && isVisited[m][n - 1] == false) {
                deepSearch(m, n - 1, grid, isVisited);
            }
        }

        if ( m+1 < grid.length){
            if (grid[m + 1][n] == '1' && isVisited[m + 1][n] == false) {
                deepSearch(m + 1, n, grid, isVisited);
            }
        }

        if ( m - 1 > -1){
            if (grid[m - 1][n] == '1' && isVisited[m - 1][n] == false) {
                deepSearch(m - 1, n, grid, isVisited);
            }
        }
    }

}

 LeetCode:https://leetcode-cn.com/problems/number-of-islands/

原文地址:https://www.cnblogs.com/iuyy/p/13413246.html