Разбор задачи: Количество анклавов

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

 def numEnclaves(grid) -> int:
        def dfs(i, j):
            grid[i][j] = 0
            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]:
                    dfs(x, y)
        m, n = len(grid), len(grid[0])
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1 and (i == 0 or j == 0 or i == m - 1 or j == n - 1):
                    dfs(i, j)
        return sum(sum(row) for row in grid)

1. Определение функции

def numEnclaves(grid) -> int:

Функция numEnclaves принимает на вход матрицу grid размера m x n, где:

  • 1 представляет сушу;
  • 0 представляет море.

Возвращает количество ячеек суши, которые полностью окружены морем.


2. Вложенная функция dfs

def dfs(i, j):
    grid[i][j] = 0
    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]:
            dfs(x, y)

Эта вспомогательная функция выполняет обход "вглубь" (DFS) начиная с координат (i, j). Ее задача:

  1. Пометить текущую ячейку суши как посещенную:

    grid[i][j] = 0
    

    Это делается, чтобы исключить повторное посещение одной и той же ячейки.

  2. Обойти всех соседей текущей ячейки (вверх, вниз, влево, вправо):

    for x, y in (i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1):
    

    Если сосед находится в пределах матрицы и представляет сушу (значение равно 1), функция dfs рекурсивно вызывается для этой ячейки.


3. Размеры матрицы

m, n = len(grid), len(grid[0])

Переменные m и n хранят количество строк и столбцов в матрице соответственно.


4. Запуск DFS для граничных ячеек

for i in range(m):
    for j in range(n):
        if grid[i][j] == 1 and (i == 0 or j == 0 or i == m - 1 or j == n - 1):
            dfs(i, j)

Цель этого фрагмента — удалить всю сушу, которая связана с границей.

  • Для каждой ячейки на границе (первая строка, последний столбец и т. д.), если она равна 1, запускается dfs от этой ячейки.
  • В результате вся суша, которая имеет путь к границе, становится 0.

5. Подсчет оставшихся ячеек суши

return sum(sum(row) for row in grid)

После выполнения dfs для всех граничных ячеек, единственные оставшиеся 1 в матрице — это ячейки суши, которые полностью окружены морем. Итоговый результат получается суммированием всех элементов матрицы.


Пример работы

Входная матрица:

grid = [[0, 0, 0, 0],
        [1, 0, 1, 0],
        [0, 1, 1, 0],
        [0, 0, 0, 0]]
  1. Граничные ячейки суши:

    • Ячейка (1, 0) на границе, запускается dfs, и она помечается как 0.
    • Ячейка (1, 2) и все связанные с ней ячейки суши тоже помечаются как 0.

    Матрица после обработки:

    [[0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]
    
  2. Подсчет оставшихся ячеек суши: Сумма всех элементов в матрице равна 0, что соответствует выходу функции.

 



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