Разбор задачи: Максимальная площадь острова

Предложенный нами код решения:

 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. Начинается обход с первой строки, пока не найдётся 1 (ячейка (0, 2)).
  2. Вызывается dfs, который:
    • Помечает (0, 2) как посещённую.
    • Рекурсивно обходит соседние ячейки и возвращает площадь острова: 1.
  3. Переход к ячейке (1, 1):
    • Вызывается dfs, который возвращает площадь 4 (суша соединена).
  4. Максимальная площадь обновляется до 4.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии