Resolver problemas como este puede ser engañosamente complicado, especialmente si no se imponen restricciones en el tamaño y la complejidad del rompecabezas.
Aquí están mis pensamientos sobre un enfoque para escribir un programa para resolver un rompecabezas como este.
Hay cuatro piezas clave de información que se pueden utilizar de forma individual y en conjunto como pistas para resolver un rompecabezas:
- La información de la forma de cada una de las piezas (cómo aparecen sus bordes)
- El información de color de cada una de las piezas (las adyacentes generalmente tendrán transiciones suaves)
- La información de orientación de cada pieza (donde pueden encontrarse los bordes planos y de esquina)
- El tamaño total y el número de piezas proporcionan las dimensiones generales o f el rompecabezas
Entonces, ¿qué tipo de información se suministrará el programa? Supongamos que cada pieza del rompecabezas es una pequeña imagen rectangular con información de transparencia utilizada para identificar la parte del rompecabezas que representa bordes no rectangulares .
A partir de esto, es relativamente fácil identificar las cuatro esquinas (en una sierra de calar típica). Estos tendrían exactamente dos bordes que tienen contornos planos (ver el mapa de contorno a continuación).
A continuación, construiría información sobre la forma de cada uno de los cuatro bordes de una pieza del rompecabezas. Esta información se puede usar para construir un adjacency matrix que indique qué piezas encajan juntas.
Ahora podemos podar esta matriz de adyacencia para identificar solo aquellas piezas que tienen transiciones de color suaves en su configuración adyacente. Esto es algo complicado porque requiere un nivel de concordancia difusa, ya que no todos los límites de píxel a píxel necesariamente tendrán una transición de color uniforme.
Usando las cuatro piezas de esquina originalmente identificadas, ahora deberíamos poder reconstruir las dimensiones y las posiciones de todas las piezas del rompecabezas.
Una estructura de datos conveniente para representar formas de borde puede ser un mapa de contorno, esencialmente un conjunto de enteros que representan los deltas incrementales en distancia desde el lado opuesto de la imagen hasta el último píxel no transparente en cada uno de los cuatro lados la pieza del rompecabezas. Las piezas que coinciden deben tener mapas de contorno de imagen especular.
Probablemente podría utilizar un hash difuso para identificar rápidamente las coincidencias probables, luego sacar la comparación más avanzada para confirmar las coincidencias y encontrar las que faltan después de resolver tanto como sea posible. –
Como nota, encontré esto mientras buscaba en la complejidad de los tiempos de resolución de rompecabezas: http://erikdemaine.org/papers/Jigsaw_GC/paper.pdf El autor muestra que este problema es NP-completo. –