Программа курса:
Разбор задачи: Гниющие апельсины
Предложенный нами код:
def orangesRotting(grid) -> int:
bfs, t, m, n = [(i, j) for i, row in enumerate(grid) for j, val in enumerate(row) if val == 2], 0, len(grid), len(grid[0])
while bfs:
new = []
for i, j in bfs:
for x, y in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):
if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
grid[x][y] = 2
new.append((x, y))
bfs = new
t += bool(bfs)
return t if all(val != 1 for row in grid for val in row) else -11. Инициализация начального состояния
bfs = [(i, j) for i, row in enumerate(grid) for j, val in enumerate(row) if val == 2]
t, m, n = 0, len(grid), len(grid[0])
- Что здесь происходит?
- Мы создаем список
bfs, который содержит координаты всех гнилых апельсинов(i, j). Это исходная очередь для обработки. t— это переменная, которая отслеживает количество минут, прошедших с начала процесса.mиn— размеры матрицыgrid(количество строк и столбцов).
- Мы создаем список
- Почему это важно?
- Наличие начальной очереди
bfsпозволяет сразу работать только с гнилыми апельсинами, пропуская пустые ячейки и свежие апельсины. - Размеры матрицы нужны для проверки, что мы не выходим за её границы.
- Наличие начальной очереди
2. Основной цикл распространения гнили
while bfs:
new = []
for i, j in bfs:
for x, y in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):
if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
grid[x][y] = 2
new.append((x, y))
bfs = new
t += bool(bfs)
- Что здесь происходит?
- Пока есть гнилые апельсины, мы запускаем цикл
while. - Внутри цикла:
- Создаем временный список
new, который будет хранить координаты свежих апельсинов, ставших гнилыми за текущую минуту. - Для каждого апельсина
(i, j)в текущей очередиbfsпроверяем его соседей в четырёх направлениях: вверх, вниз, влево, вправо. - Если соседняя ячейка содержит свежий апельсин (
grid[x][y] == 1), то:- Мы делаем его гнилым:
grid[x][y] = 2. - Добавляем его координаты в список
new.
- Мы делаем его гнилым:
- Создаем временный список
- После обработки всех гнилых апельсинов обновляем очередь
bfsновой партией гнилых апельсинов:bfs = new. - Увеличиваем время
t, если есть новые гнилые апельсины (bool(bfs)).
- Пока есть гнилые апельсины, мы запускаем цикл
- Почему это работает?
- Цикл
whileмоделирует распространение гнили минуту за минутой. - Список
newпомогает учитывать только свежие апельсины, ставшие гнилыми на текущем шаге. - Условие
0 <= x < m and 0 <= y < nгарантирует, что мы не выйдем за границы матрицы.
- Цикл
3. Проверка оставшихся свежих апельсинов
return t if all(val != 1 for row in grid for val in row) else -1
- Что здесь происходит?
- Мы проверяем, остались ли в матрице свежие апельсины:
all(val != 1 for row in grid for val in row)возвращаетTrue, если в матрице нет ячеек со значением1.
- Если свежих апельсинов больше нет, возвращаем количество минут
t. - Если хотя бы один свежий апельсин остался, возвращаем
-1.
- Мы проверяем, остались ли в матрице свежие апельсины:
- Почему это нужно?
- Если свежие апельсины остались, значит, их невозможно заразить, и задача должна вернуть
-1.
- Если свежие апельсины остались, значит, их невозможно заразить, и задача должна вернуть
Пример работы
Рассмотрим пример:
Ввод:
grid = [[2, 1, 1],
[1, 1, 0],
[0, 1, 1]]
Шаги выполнения:
- Инициализация:
bfs = [(0, 0)](координаты гнилых апельсинов).t = 0.
- Первая итерация
while:bfs = [(0, 0)], то есть один гнилой апельсин.- Проверяем его соседей:
(0, 1)становится гнилым.(1, 0)становится гнилым.
new = [(0, 1), (1, 0)].- Обновляем
bfsи увеличиваемt:t = 1.
- Вторая итерация
while:bfs = [(0, 1), (1, 0)].- Проверяем соседей:
(0, 2)становится гнилым.(1, 1)становится гнилым.
new = [(0, 2), (1, 1)].- Обновляем
bfsи увеличиваемt:t = 2.
- Третья итерация
while:bfs = [(0, 2), (1, 1)].- Проверяем соседей:
(2, 1)становится гнилым.
new = [(2, 1)].- Обновляем
bfsи увеличиваемt:t = 3.
- Четвертая итерация
while:bfs = [(2, 1)].- Проверяем соседей:
(2, 2)становится гнилым.
new = [(2, 2)].- Обновляем
bfsи увеличиваемt:t = 4.
- Пятая итерация
while:bfs = [(2, 2)].- Нет новых гнилых апельсинов.
new = [].
- Завершение работы:
bfs = [](очередь пуста).- Проверяем, остались ли свежие апельсины: их нет.
- Возвращаем
t = 4.
Вывод:
4
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии