Algo que inclui, es un catch cuando buscas en un extremo, ya que en este caso te sales del array y una bandera para que sume por una vez en la cola
from queue import Queue
STEPS = [(0, 1), (0, -1), (1, 0), (-1, 0)]
def rotting_oranges(farm: list[list[int]]) -> int:
if farm is None or len(farm) == 0:
return 0
bad_tomatoes = Queue()
good_tomatoes = 0
for i in range(len(farm)):
for j in range(len(farm[0])):
if farm[i][j] == 2:
bad_tomatoes.put((i, j))
if farm[i][j] == 1:
good_tomatoes += 1
if good_tomatoes == 0:
return 0
days = 1
while not bad_tomatoes.empty():
should_sum = False
position = bad_tomatoes.get()
for step in STEPS:
next_position = (position[0] + step[0], position[1] + step[1])
try:
if farm[next_position[0]][next_position[1]] == 1:
should_sum = True
farm[next_position[0]][next_position[1]] = 2
good_tomatoes -= 1
bad_tomatoes.put(next_position)
except IndexError:
continue
if should_sum:
days += 1
return -1 if good_tomatoes != 0 else days
if __name__ == '__main__':
assert rotting_oranges([[2, 1, 1], [1, 1, 0], [0, 1, 1]]) == 4
assert rotting_oranges([[1, 1, 1], [1, 1, 0], [0, 1, 1]]) == -1
assert rotting_oranges([[0, 1, 1], [1, 1, 0], [0, 1, 2]]) == 5
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?