Parece que me he metido en un aprieto. Literalmente. ¡Dejé caer un montón de pepinillos en el suelo y ahora están todos dispersos! Necesito que me ayudes a recogerlos a todos. Oh, ¿mencioné que tengo un montón de robots a mis órdenes? (También están todos dispersos por todo el lugar; soy realmente malo organizando las cosas).
Debe tomar la entrada en forma de:
P.......
..1..2..
.......P
........
P3PP...4
.......P
es decir, múltiples líneas de .
, P
(pickle) o un dígito (ID del robot). (Puede suponer que cada línea tiene la misma longitud, rellenada con .
). Puede ingresar estas líneas como una matriz, o sorber desde STDIN, o leer en una sola línea separada por comas, o leer un archivo, o hacer lo que quiera Me gusta tomar la entrada.
Su salida debe estar en forma de n
líneas, donde n
es la ID de robot más alta. (Las ID del robot siempre serán secuenciales a partir de 1.) Cada línea contendrá la ruta del robot, formada por las letras L
(izquierda), R
(derecha), U
(arriba) y D
(abajo). Por ejemplo, aquí hay una salida de ejemplo para ese rompecabezas:
LLU
RDR
LRRR
D
También puede ser
LLU RDR LRRR D
O
["LLU","RDR","LRRR","D"]
O cualquier formato que desee, siempre que pueda saber cuál se supone que es la solución.
Su objetivo es encontrar la salida óptima, que es la que tiene menos pasos. La cantidad de pasos se cuenta como la mayor cantidad de pasos de todos los robots. Por ejemplo, el ejemplo anterior tenía 4 pasos. Tenga en cuenta que puede haber múltiples soluciones, pero solo necesita generar una.
Puntuación:
- Su programa se ejecutará con cada uno de los 5 casos de prueba (generados aleatoriamente).
- Debe agregar los pasos de cada ejecución, y ese será su puntaje.
- Ganará el puntaje total más bajo acumulado.
- Es posible que no codifique para estas entradas específicas. Su código también debería funcionar para cualquier otra entrada.
- Los robots pueden pasar unos a otros.
- Su programa debe ser determinista, es decir, la misma salida para cada ejecución. Puede usar un generador de números aleatorios, siempre que esté sembrado y produzca consistentemente los mismos números multiplataforma.
- Su código debe ejecutarse en 3 minutos para cada una de las entradas. (Preferiblemente mucho menos).
- En caso de empate, la mayoría de los votos positivos ganarán.
Aquí están los casos de prueba. Se generaron aleatoriamente con un pequeño script Ruby que escribí.
P.......1.
..........
P.....P...
..P.......
....P2....
...P.P....
.PP..P....
....P....P
PPPP....3.
.P..P.P..P
....P.....
P....1....
.P.....PP.
.PP....PP.
.2.P.P....
..P....P..
.P........
.....P.P..
P.....P...
.3.P.P....
..P..P..P.
..1....P.P
..........
.......2P.
...P....P3
.P...PP..P
.......P.P
..P..P..PP
..P.4P..P.
.......P..
..P...P...
.....P....
PPPP...P..
..P.......
...P......
.......P.1
.P..P....P
P2PP......
.P..P.....
..........
......PP.P
.P1..P.P..
......PP..
P..P....2.
.P.P3.....
....4..P..
.......PP.
..P5......
P.....P...
....PPP..P
¡Buena suerte, y no dejes que los pepinillos se queden allí por mucho tiempo, o se echarán a perder!
Ah, y ¿por qué pepinillos, preguntas?
Por qué no?
fuente
Respuestas:
Rubí, 15 + 26 + 17 + 26 + 17 = 101
¡El robot encuentra encurtidos!
Bien, aquí hay una línea de base para que las personas comiencen, usando el siguiente algoritmo súper ingenuo:
Esto es lo que parece para el caso de prueba # 1:
Obviamente, esto no es muy bueno, ¡pero es un comienzo!
Código:
Toma información sobre STDIN exactamente en el formato del bloque de código del caso de prueba en la pregunta original. Esto es lo que imprime para esos casos de prueba:
fuente
Python, 16 + 15 + 14 + 20 + 12 = 77
Realmente no tengo experiencia previa en problemas de tipo vendedor ambulante, pero tenía un poco de tiempo libre, así que pensé en intentarlo. Básicamente intenta asignar a cada bot ciertos pepinillos caminando a través de una carrera preliminar donde van por los más cercanos y más alejados de los demás. Luego, fuerza bruta la forma más eficiente para que cada bot recoja sus encurtidos asignados.
Realmente no tengo idea de cuán viable es este método, pero sospecho que no funcionaría bien para tableros más grandes con menos bots (el cuarto tablero a veces lleva más de dos minutos).
Código:
Salida:
fuente