题目描述:给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1
示例 2:
输入: 11000 11000 00100 00011 输出: 3
解法1。DFS,有点像那道把O改成X的题,至少在DFS时把相连的O都标记成一样的是一个思路。用visited二维数组表示当前节点是否被访问过,同时只访问是岛屿的格子,即值为1的格子,再DFS递归,递归完毕就让res+1。
- 视频里把该种类型的算法成为floodfill算法:
4个方向上的flood-fill算法示例
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。在GNU Go和扫雷中,Flood Fill算法被用来计算需要被清除的区域。
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
if not grid:
return 0
m = len(grid)
n = len(grid[0])
if m <= 0 or n <= 0:
return 0
visited = [[0 for _ in range(n)] for _ in range(m)]
res = 0
for i in range(m):
for j in range(n):
if visited[i][j] == 0 and grid[i][j] == '1':
res += 1
self.dfs(grid, i, j, visited, m, n)
return res
def dfs(self, grid, i, j ,visited, m, n):
if i >= 0 and i < m and j >= 0 and j < n and visited[i][j] == 0 and grid[i][j]=='1':
visited[i][j] = 1
self.dfs(grid, i-1, j, visited, m, n)
self.dfs(grid, i+1, j, visited, m, n)
self.dfs(grid, i, j-1, visited, m, n)
self.dfs(grid, i, j+1, visited, m, n)
return