Number of Islands
Карта представлена списком строк одинаковой длины. Каждый символ — это либо 1, участок суши, либо 0, участок воды. Два участка суши принадлежат одному острову, если один находится непосредственно выше, ниже, левее или правее другого. Участки, соприкасающиеся только углами, не связаны.
Рассмотрим карту ["11000", "11000", "00100", "00011"]:
- четыре участка суши в верхнем левом углу образуют один остров,
- единственный участок в средней строке — это второй остров, так как он соприкасается с первым только углом,
- два участка в нижнем правом углу образуют третий.
Итак, на карте 3 острова.
На самом деле карта представляет собой граф: каждый участок суши — это узел, а ребро соединяет два участка суши, имеющих общую сторону. Подсчёт островов означает подсчёт связных компонент этого графа. Каждый раз, когда вы находите ещё не посещённый участок суши, вы обнаруживаете новый остров и исследуете его целиком, прежде чем двигаться дальше.
Напиши функцию с именем numIslands, которая получает grid — список строк, состоящих из 1 (суша) и 0 (вода), и возвращает количество островов. Остров — это группа клеток суши, соединённых вверх, вниз, влево или вправо.
Например, ["01110", "01000", "00011", "11001"] возвращает 3: фигуру в верхних строках, группу справа и пару в нижнем левом углу.
Ограничения: 1 <= количество строк, количество столбцов <= 150. Все строки имеют одинаковую длину.
Функция
- arg1string-array
- Возвращаетinteger
Примеры
- Ввод
- arg1 = ["11000", "11000", "00100", "00011"]
- Вывод
- 3
- Ввод
- arg1 = ["01110", "01000", "00011", "11001"]
- Вывод
- 3
+13 скрытых тестов при отправке
Подсказки
Открывайте по одной. Каждая подсказывает чуть больше.
Просматривай карту клетка за клеткой. Сколько новых островов ты только что обнаружил, когда дошёл до клетки суши, которую ещё не захватил ни один из предыдущих островов?
Как только найдёшь новый остров, обойди все соединённые с ним клетки суши и отметь каждую как посещённую, чтобы при сканировании один и тот же остров не считался повторно.
Исследуй, используя очередь (поиск в ширину) или явный стек (поиск в глубину) клеток, которые ещё предстоит посетить. Рекурсивный поиск может исчерпать стек вызовов на карте с одним огромным островом, тогда как цикл по собственной очереди или стеку — нет.
Полный разбор этой задачи скоро появится.
Похожие задачи
Задачи на те же идеи. Решите две или три, и приём запомнится.
Python
def numIslands(grid):
# Напишите код здесьСлучай 1
Случай 2
Ввод
arg1 = ["11000", "11000", "00100", "00011"]
Ожидается
3