题目描述
在给定的 m
* n
网格 grid
中,每个单元格可以有以下三个值之一:
值 0
代表空单元格;
值 1
代表新鲜橘子;
值 2
代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4
个方向上相邻 的新鲜橘子都会腐烂。
输出直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1
。
输入输出格式
输入格式
输入 m
* n
的二维矩阵(list)。
输出格式
输出直到单元格中没有新鲜橘子为止所必须经过的最小分钟整数。
输入输出样例1
输入[[2,1,1],[1,1,0],[0,1,1]]
输出4
输入输出样例2
输入[[2,1,1],[0,1,1],[1,0,1]]
输出-1
解释(可选)
左下角的橘子(第 2
行, 第 0
列)永远不会腐烂,因为腐烂只会发生在 4
个正向上。
说明提示
grid[i][j]
仅为 0、1
或 2
grid = input()
grid = eval(grid)
def orangesRotting(grid):
#********** Begin **************
#利用广度优先搜索实现
direction = [[1,0],[-1,0],[0,1],[0,-1]]
row = len(grid) # 返回输入列表的行数
col = len(grid[0]) # 返回输入列表的列数
visit = [[False] * col for i in range(row)]
time = 0
rotten = [[i, j, time] for i in range(row) for j in range(col) if grid[i][j] == 2] # 返回腐烂橘子的位置
while rotten: # 循环腐烂橘子的位置
i,j,time = rotten.pop(0) # 移除列表中的第一个元素,并且返回该元素的值。
for add_i,add_j in direction:
if 0 <= i + add_i <= row - 1 and 0 <= j + add_j <= col - 1 and not visit[i + add_i][j + add_j] and grid[i+add_i][j + add_j] == 1: # 判断新鲜的橘子是否满足变为腐烂橘子的条件。
grid[i + add_i][j + add_j] = 2 # 将新鲜的橘子变为腐烂的橘子。
rotten.append([i + add_i, j + add_j, time + 1])
# 判断列表中是否存在新鲜的橘子,如果存在则返回-1。
for i in range(row):
for j in range(col):
if grid[i][j] == 1:
return -1
return time
#********** End ************
print(orangesRotting(grid))