Skip to content

Commit 41b1359

Browse files
committed
WaterWorld
1 parent 279d233 commit 41b1359

1 file changed

Lines changed: 21 additions & 0 deletions

File tree

src/main/java/algorithms/sprint6/WaterWorld.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,27 @@
2424
import java.io.InputStream;
2525
import java.io.OutputStream;
2626

27+
/*
28+
* Принцип работы алгоритма:
29+
* Поле рассматривается как неориентированный граф: каждая клетка земли '#' — вершина,
30+
* а рёбра есть между соседними по стороне клетками земли. Идём по всем клеткам поля.
31+
* Если встречаем ещё не обработанную землю, значит найден новый остров. Запускаем из неё
32+
* итеративный BFS, помечаем все клетки этого острова как воду '.', одновременно считаем
33+
* размер острова и обновляем максимум.
34+
*
35+
* Почему алгоритм корректен:
36+
* Остров — это компонента связности клеток земли по четырём направлениям. BFS из любой
37+
* клетки такой компоненты посещает ровно все клетки этой компоненты: к каждой достижимой
38+
* по сторонам клетке он перейдёт, а за пределы компоненты не выйдет, потому что переходит
39+
* только в клетки '#'. После посещения клетки помечаются как '.', поэтому один и тот же
40+
* остров не будет посчитан повторно. Значит, каждое новое начало BFS соответствует ровно
41+
* одному острову, а посчитанный внутри BFS размер равен количеству клеток этого острова.
42+
* Перебор всех клеток гарантирует, что будут найдены все острова.
43+
*
44+
* Временная сложность: O(n * m), каждая клетка проверяется и обрабатывается не более одного раза.
45+
* Пространственная сложность: O(n * m), храним поле и очередь для BFS.
46+
*/
47+
2748
public class WaterWorld {
2849

2950
static int[] solve(byte[] map, int n, int m) {

0 commit comments

Comments
 (0)