|
24 | 24 | import java.io.InputStream; |
25 | 25 | import java.io.OutputStream; |
26 | 26 |
|
| 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 | + |
27 | 48 | public class WaterWorld { |
28 | 49 |
|
29 | 50 | static int[] solve(byte[] map, int n, int m) { |
|
0 commit comments