问题描述
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
解决方案
import collections
class Solution(object):
def is_valid(self, grid, r, c):
m, n = len(grid), len(grid[0])
if r < 0 or c < 0 or r >= m or c >= n:
return False
return True
def numIsLandsBFS(self, grid):
if not grid or not grid[0]:
return 0
m, n = len(grid), len(grid[0])
count = 0
for i in range(m):
for j in range(n):
if grid[i][j] == "1":
self.bfs(grid, i, j)
count += 1
return count
def bfs(self, grid, r, c):
queue = collections.deque()
queue.append((r, c))
grid[r][c] = "0"
while queue:
directions = [(0, 1), (0, -1), (-1, 0), (1, 0)] # 方向键
r, c = queue.popleft()
for d in directions:
nr, nc = r + d[0], c + d[1]
if self.is_valid(grid, nr, nc) and grid[nr][nc] == '1':
queue.append((nr, nc))
grid[nr][nc] = '0'
if __name__ == "__main__":
s = Solution()
my_sea = [["1", "1", "1", "1", "0"], ["1", "1", "1", "1", "0"], ["1", "1", "1", "1", "0"],
["1", "1", "1", "1", "0"]]
num = s.numIsLandsBFS(my_sea)
print(num)