El 15 Puzzle es un famoso rompecabezas que consiste en deslizar 15 fichas alrededor de una cuadrícula de 4x4. A partir de una configuración aleatoria, el objetivo es organizar los mosaicos en el orden correcto. Aquí hay un ejemplo de un 15 rompecabezas resuelto:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15
Cada movimiento en el rompecabezas tiene la forma Arriba / Abajo / Izquierda / Derecha. El movimiento "Abajo" consiste en deslizar hacia abajo la ficha que se encuentra sobre el lugar vacío. El movimiento "Derecha" consiste en deslizar un mosaico hacia la derecha, en el lugar vacío. Así es como se ve el tablero después de los movimientos hacia abajo y hacia la derecha.
01 02 03 04
05 06 07 08
09 10 11
13 14 15 12
El objetivo de este desafío es escribir un programa que pueda generar la serie de movimientos necesarios para resolver el 15 Puzzle. El ganador es el programa que resuelve los cinco casos de prueba (a continuación) en la menor cantidad de movimientos totales. La solución generada no necesita ser una solución perfecta, simplemente tiene que ser mejor que la competencia. Para cada caso de prueba individual, el programa no debe tomar más de diez segundos en una máquina razonable.
Su programa debe ser capaz de resolver cualquier rompecabezas que sea solucionable, solo estoy usando estos cinco casos de prueba como puntaje.
Su programa recibirá el 15 Puzzle sin resolver como entrada en el formato de una matriz 2D. La matriz 2D puede formatearse de acuerdo con el idioma utilizado o cambiarse si el idioma no tiene matrices 2D. El primer elemento de la primera matriz secundaria será el número en la esquina superior izquierda, y el último elemento de la primera matriz secundaria será el número en la esquina superior derecha. A 0
será el espacio vacío.
Como resultado, su programa debe imprimir una lista de movimientos en el orden en que deben realizarse. Cada paso debe estar numerado para aumentar la usabilidad de los resultados.
EDITAR: Basado en comentarios, permitiré que la salida sea en forma de Abajo / Arriba / etc. o en forma de coordenadas de la pieza a mover. Como este no es un código de golf, la parte más importante es resolver el rompecabezas.
Algunas otras reglas generales implican no usar una fuente externa, etc.
Caso de prueba 1
([5,1,7,3],[9,2,11,4],[13,6,15,8],[0,10,14,12])
Salida de ejemplo:
1: Down
2: Down
3: Down
4: Left
....
Caso de prueba 2
([2,5,13,12],[1,0,3,15],[9,7,14,6],[10,11,8,4])
Caso de prueba 3
([5,2,4,8],[10,0,3,14],[13,6,11,12],[1,15,9,7])
Caso de prueba 4
([11,4,12,2],[5,10,3,15],[14,1,6,7],[0,9,8,13])
Caso de prueba 5
([5,8,7,11],[1,6,12,2],[9,0,13,10],[14,3,4,15])
fuente
Respuestas:
PyPy, 195 movimientos, cálculo de ~ 12 segundos
Calcula soluciones óptimas utilizando IDA * con una heurística de 'distancia caminando' aumentada con conflictos lineales. Aquí están las soluciones óptimas:
Y el codigo:
fuente
JavaScript (ES6) pasos totales 329 para los 5 casos de prueba en ~ 1 minuto
Editar misma estrategia, diferentes objetivos, mejor solución. Más lento ...
Esto es más o menos cómo lo resuelvo a mano: usando objetivos intermedios. Después de cada objetivo, las fichas relativas no se mueven de nuevo. Cada objetivo intermedio se alcanza mediante una función BSF paramétrica. Los 2 parámetros son la condición de bucle L (repetir mientras es verdadero) y la condición de selección S (seleccione qué mosaico se puede mover). Los pasos:
Nota al margen No verifico la posición de las fichas 14 y 15. Los acertijos sin resolver como
[11,4,12,2,,15,10,3,5,,14,1,6,7,,0,9,8,13]
tendrán 14 y 15 intercambiados.Fragmento abierto para probar o jugar (solo Firefox)
Mostrar fragmento de código
Conjunto de pruebas en la consola Firefox / FireBug
Salida
fuente
Comencé a trabajar en este problema y quería contribuir con mi código hasta ahora. Como dijo Gareth, el problema es comparable al rompecabezas de 8 fichas y, por lo tanto, el código se basa en la magnífica solución de Keith Randall y, por lo tanto, en Python. Esta solución puede resolver los 5 casos de prueba con una suma total de menos de 400 movimientos, y también otros rompecabezas. Contiene una solución optimizada y una fuerza bruta. El código está un poco hinchado por ahora. La salida se abrevia como "llururd .." Espero que sea útil. http://www.penschuck.org/joomla/tmp/15Tile.txt (explicación) http://www.penschuck.org/joomla/tmp/tile15.txt (código de Python)
fuente