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

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

 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", чтобы избежать повторного посещения.
  2. Проверка соседних ячеек:
    Если соседняя ячейка сверху, слева, снизу или справа является сушей ("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. Проход по всей матрице:
    Два вложенных цикла проходят по каждой ячейке матрицы.
  2. Проверка на сушу:
    Если текущая ячейка — это суша ("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"]
]

  1. Инициализация:
    • res = 0, n = 4, m = 5.
  2. Первая итерация:
    • (i, j) = (0, 0):
      Текущая ячейка — "1".
      • Вызывается explore(0, 0).
      • Все соседние ячейки, которые принадлежат острову, помечаются как "-1".
    • Завершив исследование острова, увеличиваем res на 1:
      res = 1.
  3. Дальнейшие итерации:
    • Остальные ячейки на этом острове ("-1") пропускаются.
    • Других островов нет.
  4. Результат:
    res = 1.

 



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