Wydaje mi się, że wpadłem w zalew. Dosłownie Upuściłem kilka pikli na podłogę, a teraz wszystkie są rozrzucone! Musisz mi pomóc zebrać je wszystkie. Och, czy wspominałem, że mam do dyspozycji kilka robotów? (Wszystkie są też rozrzucone po całym mieście; jestem naprawdę kiepski w organizowaniu rzeczy.)
Musisz wziąć wkład w postaci:
P.......
..1..2..
.......P
........
P3PP...4
.......P
czyli wielokrotne linie albo .
, P
(ogórek) lub cyfra (ID robota). (Możesz założyć, że każda linia ma równą długość, .
jest uzupełniona.) Możesz wprowadzić te linie jako tablicę, lub slurp ze STDIN, lub odczytać w oddzielonym przecinkami pojedynczym wierszu, lub odczytać plik, lub zrobić cokolwiek byś zrobił lubię brać wkład.
Twój wynik musi mieć postać n
linii, gdzie n
jest najwyższy identyfikator robota. (Identyfikatory robotów będą zawsze sekwencyjne, zaczynając od 1.) Każda linia będzie zawierać ścieżkę robota, utworzoną z liter L
(po lewej), R
(po prawej), U
(w górę) i D
(w dół). Na przykład oto przykładowy wynik dla tej układanki:
LLU
RDR
LRRR
D
Może być również
LLU RDR LRRR D
Lub
["LLU","RDR","LRRR","D"]
Lub dowolny format, który chcesz, pod warunkiem, że możesz powiedzieć, jakie powinno być rozwiązanie.
Twoim celem jest znalezienie optymalnej wydajności, która ma najmniejszą liczbę kroków. Ilość kroków jest liczona jako największa liczba kroków ze wszystkich robotów. Na przykład powyższy przykład miał 4 kroki. Pamiętaj, że może istnieć wiele rozwiązań, ale wystarczy tylko jedno z nich.
Punktacja:
- Twój program zostanie uruchomiony z każdym z 5 (losowo wygenerowanych) przypadków testowych.
- Musisz dodać kroki z każdego biegu, a to będzie twój wynik.
- Wygra najniższy łączny łączny wynik.
- Nie można na stałe kodować tych konkretnych danych wejściowych. Twój kod powinien także działać z innymi wejściami.
- Roboty mogą się przenikać.
- Twój program musi być deterministyczny, tj. Taki sam wynik dla każdego uruchomienia. Możesz użyć generatora liczb losowych, o ile jest on rozstawiony i konsekwentnie wytwarza te same liczby na różnych platformach.
- Twój kod musi zostać uruchomiony w ciągu 3 minut dla każdego wejścia. (Najlepiej znacznie mniej.)
- W przypadku remisu większość zwycięstw wygra.
Oto przypadki testowe. Zostały wygenerowane losowo za pomocą małego skryptu Ruby, który napisałem.
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
Powodzenia i nie pozwól, aby pikle siedzieli tam zbyt długo, bo inaczej się zepsują!
Aha, a dlaczego pikle, pytasz?
Dlaczego nie?
źródło
Odpowiedzi:
Rubin, 15 + 26 + 17 + 26 + 17 = 101
Robot znajdzie pikle!
Okej, oto podstawa, od której ludzie mogą zacząć, używając następującego naiwnego algorytmu:
Oto jak wygląda przypadek testowy nr 1:
Oczywiście nie jest to zbyt dobre, ale to początek!
Kod:
Pobiera dane wejściowe STDIN w dokładnie formacie bloku kodu przypadku testowego w pierwotnym pytaniu. Oto, co drukuje dla tych przypadków testowych:
źródło
Python, 16 + 15 + 14 + 20 + 12 = 77
Tak naprawdę nie mam żadnego wcześniejszego doświadczenia z problemami typu sprzedawca w podróży, ale miałem trochę czasu, więc pomyślałem, że spróbuję. Zasadniczo próbuje on przydzielić każdemu botowi niektóre pikle, przechodząc go przez wstępny bieg, w którym idą do tych najbliższych i najdalszych od innych. Następnie brutalnie wymusza najskuteczniejszy sposób zbierania przydzielonych pikli dla każdego bota.
Naprawdę nie mam pojęcia, jak opłacalna jest ta metoda, ale podejrzewam, że nie sprawdziłaby się w przypadku większych kart z mniejszą liczbą botów (czwarta tablica już czasami zajmuje ponad dwie minuty).
Kod:
Wynik:
źródło