Il me semble que je me suis mis un peu dans le pétrin. Au sens propre. J'ai laissé tomber un tas de cornichons sur le sol et maintenant ils sont tous éparpillés! J'ai besoin de vous pour m'aider à les collecter tous. Oh, ai-je mentionné que j'avais un tas de robots à ma disposition? (Ils sont également tous dispersés un peu partout; je suis vraiment mal à organiser les choses.)
Vous devez prendre connaissance sous la forme de:
P.......
..1..2..
.......P
........
P3PP...4
.......P
c'est-à-dire, plusieurs lignes de .
, P
(cornichon) ou un chiffre (ID du robot). (Vous pouvez supposer que chaque ligne est de longueur égale, complétée par .
.) Vous pouvez entrer ces lignes sous forme de tableau, ou slurp à partir de STDIN, ou lire dans une seule ligne séparée par des virgules, ou lire un fichier, ou faire ce que vous voulez tiens à prendre l'entrée.
Votre sortie doit être sous forme de n
lignes, où n
est l'ID de robot le plus élevé. (Les identifiants des robots seront toujours séquentiels à partir de 1.) Chaque ligne contiendra le chemin du robot, formé des lettres L
(gauche), R
(droite), U
(haut) et D
(bas). Par exemple, voici un exemple de sortie pour ce puzzle:
LLU
RDR
LRRR
D
Il peut également être
LLU RDR LRRR D
Ou
["LLU","RDR","LRRR","D"]
Ou tout format que vous souhaitez, tant que vous pouvez dire quelle est la solution censée être.
Votre objectif est de trouver la sortie optimale, qui est celle qui a le moins d'étapes. Le nombre de pas est compté comme le plus grand nombre de pas de tous les robots. Par exemple, l'exemple ci-dessus comportait 4 étapes. Notez qu'il peut y avoir plusieurs solutions, mais il vous suffit d'en générer une seule.
Notation:
- Votre programme sera exécuté avec chacun des 5 cas de test (générés aléatoirement).
- Vous devez ajouter les étapes de chaque course, et ce sera votre score.
- Le score cumulatif total le plus bas gagnera.
- Vous ne pouvez pas coder en dur pour ces entrées spécifiques. Votre code devrait également fonctionner pour toute autre entrée.
- Les robots peuvent se traverser.
- Votre programme doit être déterministe, c'est-à-dire la même sortie pour chaque exécution. Vous pouvez utiliser un générateur de nombres aléatoires, tant qu'il est prédéfini et produit systématiquement les mêmes nombres multiplateforme.
- Votre code doit s'exécuter dans les 3 minutes pour chacune des entrées. (De préférence beaucoup moins.)
- En cas d'égalité, la plupart des votes positifs l'emporteront.
Voici les cas de test. Ils ont été générés au hasard avec un petit script Ruby que j'ai écrit.
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
Bonne chance et ne laissez pas les cornichons rester trop longtemps, sinon ils se gâteront!
Oh, et pourquoi les cornichons, demandez-vous?
Pourquoi pas?
la source
Réponses:
Rubis, 15 + 26 + 17 + 26 + 17 = 101
Un robot trouve des cornichons!
D'accord, voici une base pour démarrer les gens, en utilisant l'algorithme super-naïf suivant:
Voici à quoi cela ressemble pour le cas de test n ° 1:
Évidemment, ce n'est pas très bon mais c'est un début!
Code:
Prend l'entrée sur STDIN dans exactement le format du bloc de code de cas de test dans la question d'origine. Voici ce qu'il imprime pour ces cas de test:
la source
Python, 16 + 15 + 14 + 20 + 12 = 77
Je n'ai pas vraiment d'expérience de problèmes de type vendeur itinérant, mais j'avais un peu de temps à disposition, alors j'ai pensé que je pourrais essayer. Il essaie essentiellement d'attribuer à chaque bot certains cornichons en le parcourant lors d'une course préliminaire où ils se dirigent vers les plus proches d'eux et les plus éloignés des autres. Il force ensuite brutalement le moyen le plus efficace pour chaque bot de collecter ses cornichons alloués.
Je n'ai vraiment aucune idée de la viabilité de cette méthode, mais je soupçonne qu'elle ne fonctionnerait pas bien pour les plus grandes cartes avec moins de bots (la quatrième planche prend déjà parfois plus de deux minutes).
Code:
Production:
la source