Программа курса:
Разбор задачи: Количество анклавов
Предложенный нами код:
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). Ее задача:
Пометить текущую ячейку суши как посещенную:
grid[i][j] = 0Это делается, чтобы исключить повторное посещение одной и той же ячейки.
Обойти всех соседей текущей ячейки (вверх, вниз, влево, вправо):
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, 0)на границе, запускаетсяdfs, и она помечается как0. - Ячейка
(1, 2)и все связанные с ней ячейки суши тоже помечаются как0.
Матрица после обработки:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]- Ячейка
- Подсчет оставшихся ячеек суши: Сумма всех элементов в матрице равна
0, что соответствует выходу функции.