Rozwiązywanie takich problemów może być zwodniczo skomplikowane, szczególnie jeśli nie ma ograniczeń co do rozmiaru i złożoności układanki.
Oto moje przemyślenia na temat podejścia do pisania programu do rozwiązania takiej łamigłówki.
Istnieją cztery główne fragmenty informacji, które można wykorzystać indywidualnie i wspólnie jako wskazówki do rozwiązywania puzzli:
- Informacje kształt każdego z kawałków (jak wyglądają ich krawędzie)
- informacje o kolorze każdego z elementów (sąsiednie elementy będą generalnie gładkie)
- Informacja o orientacji każdego elementu (gdzie mogą znajdować się krawędzie płaskie i narożne)
- Ogólny rozmiar i liczba sztuk określają ogólne wymiary o f układanki
Więc jaki rodzaj informacji będzie program zostanie dostarczony - załóżmy, że każdy kawałek układanki jest niewielki prostokątny obraz z informacjami przejrzystości używane do identyfikacji części puzzle, które stanowią nie-prostokątne krawędzie .
Z tego względnie łatwo zidentyfikować cztery elementy narożne (w typowej układance). Mają one dokładnie dwie krawędzie, które mają płaskie kontury (patrz mapa konturu poniżej).
Następnie chciałbym uzyskać informacje na temat kształtu każdej z czterech krawędzi łamigłówki. Ta informacja może być użyta do zbudowania adjacency matrix wskazującej, które elementy pasują do siebie.
Teraz możemy przycinać matrycę przyległości, aby zidentyfikować tylko te elementy, które mają gładkie przejścia kolorów w sąsiedniej konfiguracji. Jest to nieco skomplikowane, ponieważ wymaga poziomu dopasowania rozmytego - ponieważ nie każda granica pikseli do pikseli musi mieć płynne przejścia kolorów.
Używając czterech oryginalnych elementów narożnych, powinniśmy teraz odtworzyć wymiary i pozycje wszystkich elementów układanki.
Dogodną strukturą danych do przedstawiania kształtów krawędzi może być mapa konturowa - zasadniczo zbiór liczb całkowitych reprezentujących przyrostowe delty w odległości od przeciwnej strony obrazu do ostatniego nieprzezroczystego piksela w każdym z czterech boków obrazu kawałek układanki. Pasujące elementy powinny mieć odwzorowane kontury lustrzane.
Prawdopodobnie można użyć rozmytego skrótu, aby szybko zidentyfikować prawdopodobne dopasowania, a następnie przedstawić bardziej zaawansowane porównanie, aby potwierdzić dopasowania i znaleźć brakujące po rozwiązaniu jak najwięcej. –
Na marginesie, znalazłem to, rozglądając się wokół złożoności czasów rozwiązywania układów puzzli: http://erikdemaine.org/papers/Jigsaw_GC/paper.pdf Autor pokazuje, że ten problem jest NP-zupełny. –