题目描述
给你一个由 '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/