200. 岛屿数量(Python)

题目

难度:★★★☆☆
类型:数组
方法:深度优先搜索

传送门

给你一个由 '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
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

解答

可以使用深度优先搜索方法,逐个点遍历,每次遇到一个岛屿,就将这个岛屿淹没,统计被淹没的岛屿的数目就好。这里为了便于理解,采用了实例化岛屿和探测点。


class Board:
    def __init__(self, value):
        self.value = value
        self.height = len(value)
        self.width = len(value[0])

    def is_valid_point(self, point):
        h, w = point.h, point.w
        return (0 <= h < self.height) and (0 <= w < self.width)

    def get_value(self, p):
        if self.is_valid_point(p):
            return self.value[p.h][p.w]

    def set_value(self, p, val):
        if self.is_valid_point(p):
            self.value[p.h][p.w] = val


class Point:
    def __init__(self, loc):
        self.value = loc
        self.h, self.w = loc

    @property
    def next_left(self):
        return Point((self.h, self.w-1))

    @property
    def next_right(self):
        return Point((self.h, self.w+1))

    @property
    def next_up(self):
        return Point((self.h-1, self.w))

    @property
    def next_down(self):
        return Point((self.h+1, self.w))


class Solution:
    def numIslands(self, grid):

        land_flag, sea_flag = '1', '0'

        if not grid or not grid[0]:
            return 0

        board = Board(grid)

        def dfs(p):
            if board.get_value(p) == land_flag:
                board.set_value(p, sea_flag)
                dfs(p.next_left)
                dfs(p.next_right)
                dfs(p.next_up)
                dfs(p.next_down)

        res = 0
        for h in range(board.height):
            for w in range(board.width):
                cur_point = Point((h, w))
                if board.get_value(cur_point) == land_flag:
                    res += 1
                    dfs(cur_point)    # 淹没掉这个岛屿

        return res

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(200. 岛屿数量(Python))