📌  相关文章
📜  计算二进制矩阵中被 1 阻塞的所有 0(1)

📅  最后修改于: 2023-12-03 15:27:58.866000             🧑  作者: Mango

计算二进制矩阵中被 1 阻塞的所有 0

在二进制矩阵中,被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进行搜索,则需要使用队列进行存储遍历的节点。