1. 程式人生 > 實用技巧 >島嶼數量-LeetCode

島嶼數量-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/