1. 题目
2. 考点
广度优先算法BFS
3. 核心代码
从业务需求出发
def test(grid):
row = len(grid)
col = len(grid[0])
bad_lst, good_lst = set(), set()
for i in range(row):
for j in range(col):
grid[i][j] == 2 and bad_lst.add((i, j)) # 腐烂集合
grid[i][j] == 1 and good_lst.add((i, j)) # 新鲜集合
count = 0
while good_lst:
if not bad_lst: return -1
tmp_bad = set()
for i, j in bad_lst:
for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
if (i + di, j + dj) in good_lst:
tmp_bad.add((i + di, j + dj))
bad_lst = tmp_bad # 更新腐烂集合
count += 1
good_lst -= bad_lst # 剔除腐烂的
return count
if __name__ == '__main__':
grid = [[2, 1, 1], [1, 1, 0], [0, 1, 1]]
print(test(grid))
使用广度优先算法
def test(grid):
row, col, count = len(grid), len(grid[0]), 0
directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
queue = []
# 所有烂橘子全部入队
for i in range(row):
for j in range(col):
grid[i][j] == 2 and queue.append((i, j, count))
# 使用bfs进行广度优先搜索
while queue:
# 队列先进先出 所以添加从最后添加 出来从首位开始取值
i, j, count = queue.pop(0)
for di, dj in directions:
if 0 <= i + di < row and 0 <= j + dj < col and grid[i + di][j + dj] == 1:
grid[i + di][j + dj] = 2
queue.append((i + di, j + dj, count + 1))
# 判断橘子最后是否还存在没有坏的
for row in grid:
if 1 in row: return -1
return count
if __name__ == '__main__':
print(test([[2, 1, 1], [1, 1, 0], [0, 1, 1]]))