Realmente me encantan los rompecabezas de fichas deslizantes, pero recientemente, no he tenido tiempo para ellos. Por lo tanto, necesito un programa que me proporcione mi solución de rompecabezas de fichas deslizantes, específicamente los rompecabezas de Klotski.
Su entrada estará en el siguiente formato:
#######
#001gg#
##.222#
.######
donde #
representa paredes, .
representa un área abierta, g
representa la meta y los números adyacentes representan diferentes bloques. Puedes asumir que:
- No habrá más de 10 bloques.
- No habrá dos bloques con el mismo número.
- Todos los bloques estarán encerrados por paredes.
- La cuadrícula es rectangular
- El
0
bloque es lo suficientemente grande como para cubrir todos los cuadrados de la portería. - Hay una solucion valida
Debes devolver una secuencia de movimientos que colocará el 0
bloque para que cubra todos los cuadrados de la portería. Los bloques no pueden atravesar paredes u otros bloques. Para el rompecabezas anterior, una secuencia apropiada sería
2L,1R,1R,1D,0R,0R,0R
mientras que representa mover el 2
bloque 1 cuadro a la izquierda, el 1
bloque 2 cuadros a la derecha (en la parte superior de la portería) luego 1 cuadro hacia abajo y luego 0
3 cuadros a la derecha.
En realidad, hay varias secuencias que funcionarán para el problema anterior, y producir cualquiera de ellas es aceptable. Su solución debe ser óptima, lo que significa que debe producir una secuencia que resuelva el rompecabezas en el menor número de pasos posible.
La secuencia debe imprimirse como se indicó anteriormente, pero puede estar separada por comas, líneas nuevas o espacios. No me importa si hay comas finales o espacios en blanco. Debe producir la salida en un tiempo razonable (máximo 120 segundos en los siguientes acertijos).
Rompecabezas 1:
..####..
..#00#..
###00###
#......#
#.1122.#
##3124##
.#3344#.
.##55##.
..#gg#..
..####..
Rompecabezas 2:
######
#1002#
#1002#
#3445#
#3675#
#8gg9#
######
Rompecabezas 3:
.####.
##1g##
#22g3#
#4255#
#4.56#
#.006#
#7008#
######
Rompecabezas 4:
.####.
##00##
#.00g#
#.0.1#
#..g2#
######
Este es el código de golf, por lo que gana la solución más corta (en bytes).
fuente
Respuestas:
Pitón, 1761
Un poco agotado por esta pregunta, así que no pude llevarme al golf. De cualquier manera, en este momento es la única solución que resuelve todo dentro del límite de tiempo (el más largo, # 3, toma 27 segundos).
fuente
JavaScript (ES6), 446
388Breadth First Search, por lo que la primera solución encontrada es la más corta.
Si bien sigo pensando que es una buena solución, no es lo suficientemente buena. Incluso después de verificar millones de posiciones (tiempo de ejecución varios minutos), no pude encontrar una solución, por ejemplo, 2 y 3.
Edite la versión modificada de ES6 para superar el límite de tiempo de ejecución de JavaScript. Puzzle 3 resuelto en 7 minutos, 145 pasos. Puzzle 2 resuelto en 10 minutos, 116 pasos
Edite 2 Big speedup, utilizando la idea de @ orlp de considerar iguales dos bloques con la misma forma (excluyendo el bloque '0' que es especial). Esto reduce el espacio de puestos visitados durante BSF. Por ejemplo, para el rompecabezas 2, cualquier posición con el bloque 1,2,3 o 5 intercambiado es realmente la misma.
Tiempo: el más largo es el rompecabezas 3, ~ 20 segundos en mi computadora portátil.
Usa Firefox para jugar con el nuevo JsFiddle para probar.
Anticuado
EcmaScript 6 (FireFox) JSFiddleEcmaScript 5 (Chrome) JSFiddleEjemplo
Rompecabezas 1
Puzzle 2
Puzzle 3
Puzzle 4
fuente