Программа курса:
Разбор задачи: Максимальная площадь острова
Предложенный нами код решения:
def max_area_of_island(grid):
# Вспомогательная функция для подсчёта площади острова
def dfs(x, y):
# Если за пределами или на воде, вернуть 0
if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] == 0:
return 0
# Пометить текущую ячейку как посещённую
grid[x][y] = 0
# Суммировать текущую ячейку и соседние
return 1 + dfs(x - 1, y) + dfs(x + 1, y) + dfs(x, y - 1) + dfs(x, y + 1)
max_area = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1:
max_area = max(max_area, dfs(i, j))
return max_area
Заголовок функции
def max_area_of_island(grid):
Функция max_area_of_island принимает на вход матрицу grid, представляющую двоичную матрицу, где 1 обозначает сушу, а 0 — воду. Цель — найти максимальную площадь острова.
Вспомогательная функция
def dfs(x, y):
Вспомогательная функция dfs реализует поиск в глубину (DFS) для подсчёта площади острова, начиная с заданной ячейки (x, y).
Базовый случай
if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] == 0:
return 0
Если текущая ячейка выходит за пределы матрицы или представляет воду (grid[x][y] == 0), функция возвращает 0. Это условие предотвращает выход за границы и обработку воды.
Пометка посещённой ячейки
grid[x][y] = 0
После обработки ячейки, её значение изменяется на 0, чтобы предотвратить повторное посещение.
Рекурсивный вызов
return 1 + dfs(x - 1, y) + dfs(x + 1, y) + dfs(x, y - 1) + dfs(x, y + 1)
Функция возвращает 1 (текущая ячейка) плюс площади всех соседних ячеек, которые также являются частью острова. Обход осуществляется в четырёх направлениях: вверх, вниз, влево и вправо.
Основной цикл
max_area = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
Здесь инициализируется переменная max_area, хранящая максимальную площадь острова. Два вложенных цикла проходят по всем ячейкам матрицы.
Проверка ячейки
if grid[i][j] == 1:
max_area = max(max_area, dfs(i, j))
Если текущая ячейка является сушей (1), вызывается функция dfs, и результат сравнивается с текущим максимумом. Таким образом, обновляется максимальная площадь острова.
Возврат результата
return max_area
После обработки всех ячеек функция возвращает максимальную площадь острова.
Пример работы
Для входной матрицы:
grid = [
[0, 0, 1, 0],
[1, 1, 1, 0],
[0, 0, 0, 0]
]
Ход выполнения
- Начинается обход с первой строки, пока не найдётся
1(ячейка(0, 2)). - Вызывается
dfs, который:- Помечает
(0, 2)как посещённую. - Рекурсивно обходит соседние ячейки и возвращает площадь острова:
1.
- Помечает
- Переход к ячейке
(1, 1):- Вызывается
dfs, который возвращает площадь4(суша соединена).
- Вызывается
- Максимальная площадь обновляется до
4.