题目
难度:★★★☆☆
类型:数组
方法:深度优先搜索
给你一个由 '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
如有疑问或建议,欢迎评论区留言~