Программа курса:
Разбор задачи: Количество островов
Предложенный нами код решения:
def numIslands(grid):
res, n, m = 0, len(grid), len(grid[0]) if grid else 0
def explore(i, j):
grid[i][j] = "-1"
if i > 0 and grid[i - 1][j] == "1": explore(i - 1, j)
if j > 0 and grid[i][j - 1] == "1": explore(i, j - 1)
if i + 1 < n and grid[i + 1][j] == "1": explore(i + 1, j)
if j + 1 < m and grid[i][j + 1] == "1": explore(i, j + 1)
for i in range(n):
for j in range(m):
if grid[i][j] == "1": explore(i, j); res += 1
return resЗаголовок функции
def numIslands(grid):Функция numIslands принимает на вход двумерный список grid, который представляет собой карту, где "1" — это суша, а "0" — вода. Задача состоит в том, чтобы найти количество островов, представляющих собой соединённые области суши.
Инициализация переменных
res, n, m = 0, len(grid), len(grid[0]) if grid else 0
res— переменная для хранения количества островов, изначально равна 0.n— количество строк в матрице.m— количество столбцов в матрице.- Проверяется, есть ли вообще матрица (
if grid). Если её нет,mбудет равно 0.
Вложенная функция explore
def explore(i, j):
grid[i][j] = "-1"
if i > 0 and grid[i - 1][j] == "1": explore(i - 1, j)
if j > 0 and grid[i][j - 1] == "1": explore(i, j - 1)
if i + 1 < n and grid[i + 1][j] == "1": explore(i + 1, j)
if j + 1 < m and grid[i][j + 1] == "1": explore(i, j + 1)
Эта функция используется для исследования области суши, начиная с координат (i, j):
- Отметка текущей ячейки:
Текущая ячейка помечается как"-1", чтобы избежать повторного посещения. - Проверка соседних ячеек:
Если соседняя ячейка сверху, слева, снизу или справа является сушей ("1"), вызываетсяexploreдля этой ячейки.
Например:i > 0проверяет, есть ли ячейка сверху, и проверяет её значение.j > 0проверяет, есть ли ячейка слева.i + 1 < nпроверяет, есть ли ячейка снизу.j + 1 < mпроверяет, есть ли ячейка справа.
Таким образом, explore рекурсивно проходит через все ячейки, которые принадлежат текущему острову.
Основной цикл
for i in range(n):
for j in range(m):
if grid[i][j] == "1": explore(i, j); res += 1
- Проход по всей матрице:
Два вложенных цикла проходят по каждой ячейке матрицы. - Проверка на сушу:
Если текущая ячейка — это суша ("1"), значит, найден новый остров.- Запускается исследование острова, начиная с этой ячейки, с помощью
explore. - После завершения исследования счётчик островов
resувеличивается на 1.
- Запускается исследование острова, начиная с этой ячейки, с помощью
Возврат результата
return res
После завершения обхода всей матрицы возвращается общее количество островов.
Пошаговый пример работы
Входные данные:
grid = [
["1", "1", "1", "1", "0"],
["1", "1", "0", "1", "0"],
["1", "1", "0", "0", "0"],
["0", "0", "0", "0", "0"]
]
- Инициализация:
res = 0,n = 4,m = 5.
- Первая итерация:
(i, j) = (0, 0):
Текущая ячейка —"1".- Вызывается
explore(0, 0). - Все соседние ячейки, которые принадлежат острову, помечаются как
"-1".
- Вызывается
- Завершив исследование острова, увеличиваем
resна 1:res = 1.
- Дальнейшие итерации:
- Остальные ячейки на этом острове (
"-1") пропускаются. - Других островов нет.
- Остальные ячейки на этом острове (
- Результат:
res = 1.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии