У меня есть "бесконечная" 2D-сетка, и я хочу обнаружить закрытые/полные "структуры" - области любой формы, которые заключены со всех сторон. Тем не менее, мне нужно идентифицировать каждую отдельную замкнутую цепь, включая большую форму, если таковая имеется.
Изучая это, я обнаружил алгоритм обнаружения цикла, но я не вижу чистого/эффективного способа отделить большую схему от меньших.
Например, следующие две "полные" структуры:
0 1 1 1 0
0 1 0 1 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 1 1
0 1 0 1 0 1
0 1 1 1 1 1
Первая - это одна ячейка, заключенная в 8 "стен". Обнаружение цикла делает его тривиальным, чтобы обнаружить это.
Второй пример состоит из двух экземпляров примера 1, но они разделяют стену. Меня интересуют три отдельных схемы - левая комната, правильная комната и общая структура.
Несколько проходов алгоритма цикла могут работать, но я должен быть уверен, что не вернусь к уже найденной форме.
Я также рассмотрел алгоритм заполнения заливки, но похоже, что это делает предположение, что вы уже знаете точку внутри ограниченной области. С бесконечной 2D-сеткой мне понадобится ограничение по размеру, чтобы заставить его отказаться, если оно не в допустимой структуре.
Есть ли решения, которые мне не хватает или я что-то пропустил с мыслями?
Я буду делать это только "check", когда добавляется граничное значение. Используя вышеприведенный пример, если я изменяю любые 0 → 1, новый цикл имеет потенциально, и я буду запускать логику. Мне не нужно идентифицировать отдельные структуры и всегда иметь координату начала.
Я изучал решения размещенные здесь, но все они основаны на том, что уже знают, какие узлы подключены к другим узлам. Я уже играл с логикой, которая идентифицирует каждую отдельную "линию", и я могу продолжать идти оттуда, но она чувствует себя излишней.