Harder Sokoban


Submit solution

Points: 100 (partial)
Time limit: 1.0s
Memory limit: 64M

Authors:
Problem type
Allowed languages
Ada, Assembly, Awk, BrainF***, C, C#, C++, Dart, Go, Java, JS, Kotlin, Lua, Pascal, Perl, Prolog, Python, Scala, Swift, VB

Toby es una persona terrible, le gusta robar juegos de internet para publicarlos como propios. Por lo tanto, para su siguiente robo Toby encontró un juego llamado "Sokoban", un juego donde un jugador empujones cajas o cajones de todo en un almacén, tratando de llegar a los lugares de almacenamiento. No importa qué caja termine en qué ubicación de almacenamiento, el único requisito es que todas las posiciones finales de las cajas deben ser una ubicación de almacenamiento. Además, las cajas pueden "pasar" libremente a través de ubicaciones de almacenamiento a medida que pasan a otra ubicación de almacenamiento. A continuación se muestra un ejemplo del clásico juego de Sokoban:

enter image description here

Donde '#' representa una pared (no transitable), 'G' representa una ubicación de almacenamiento, 'B' representa una caja, y 'T' representa la posición inicial del jugador. El juego en sí es bastante difícil, porque el jugador no puede atravesar cajas (o paredes), y solo puede empujar una caja desde su posición, debido a esto, a veces, un rompecabezas "fácil" puede ser muy complicado, como este:

enter image description here

Sí, de hecho, este rompecabezas podría resolverse en solo 3 movimientos si la posición inicial del jugador estuviera "debajo" de las casillas. Y debido a esto, Toby quiere "clonar" este juego en una versión diferente, cambiando una regla simple: "El jugador puede transportarse a sí mismo a cualquier lugar vacío". De esta manera, Toby puede publicar su versión del juego "Harder Sokoban".

Su tarea es ayudar a Toby a escribir un programa para calcular el número mínimo de movimientos de caja que se necesitan para colocar cada caja desde sus posiciones iniciales a una ubicación de almacenamiento (puede ser cualquier ubicación de almacenamiento). Recuerde, no se pueden empujar dos cajas al mismo tiempo, y dos cajas no pueden ocupar el mismo espacio, una caja no se puede empujar a través o sobre una pared o sobre otra caja.

Especificación de entrada
La primera línea contiene dos enteros N y M que indican el tamaño del almacén. Las siguientes N líneas contienen exactamente M caracteres, un '#' representa un muro, un '.' (punto) representa un mosaico transitable, 'G' representa una ubicación de almacenamiento, 'B' representa un cuadro. El mapa siempre está delimitado por muros.

3 <= N, M <= 10
No habrá más de 3 cajas en la entrada.

Especificación de salida
Debe generar una sola línea con un número entero con el número mínimo de movimientos de cajas para completar el nivel.
Ejemplo de entrada

7 6

######
#...##
#GGG##
#BBB##
#....#
#....#
######

Ejemplo de salida

3


Comments

There are no comments at the moment.