📅  最后修改于: 2023-12-03 15:27:58.866000             🧑  作者: Mango
在二进制矩阵中,被1包围的0称为被1阻塞的0。我们需要编写一个函数,通过输入一个二进制矩阵,计算所有被1阻塞的0的数量。
例如,以下二进制矩阵:
[
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 0, 0, 0, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1]
]
其中被1阻塞的0的数量为1。
我们可以使用深度优先搜索(DFS)进行求解。遍历二进制矩阵,每次遍历到一个被1阻塞的0,就将其标记为已访问,然后继续向四个方向(上、下、左、右)进行遍历,直到遍历到二进制矩阵的边缘或已访问过的节点为1为止。同样的,我们也可以使用广度优先搜索(BFS)进行求解。
def bfs(grid, i, j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 1:
# i,j越界或已经访问过或已经被1包围
return
grid[i][j] = 1
queue = [(i, j)]
while queue:
i, j = queue.pop(0)
if i > 0 and grid[i-1][j] == 0: # 上
grid[i-1][j] = 1
queue.append((i-1, j))
if i < len(grid)-1 and grid[i+1][j] == 0: # 下
grid[i+1][j] = 1
queue.append((i+1, j))
if j > 0 and grid[i][j-1] == 0: # 左
grid[i][j-1] = 1
queue.append((i, j-1))
if j < len(grid[0])-1 and grid[i][j+1] == 0: # 右
grid[i][j+1] = 1
queue.append((i, j+1))
def numIslands(grid):
if not grid:
return 0
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 0:
bfs(grid, i, j)
count += 1
return count
本题考察了深度优先搜索(DFS)和广度优先搜索(BFS)的应用。需要注意的是,在进行搜索时,需要判断当前节点是否越界、是否已经访问过和是否已经被1包围。同时,如果采用BFS进行搜索,则需要使用队列进行存储遍历的节点。