Kilka samochodów ustawionych w kolejce na 4-kierunkowym znaku stopu czeka na kontynuację. Wszyscy są zdezorientowani, kto będzie następny, kto idzie w którą stronę itp. Wyraźnie nieoptymalny.
Twoim zadaniem jest optymalne zaplanowanie ruchu na znaku stop.
Otrzymujesz jako dane wejściowe 4 ciągi żądań zwrotu, po jednym dla każdego z czterech głównych kierunków. Każde żądanie dotyczy L
lewej, S
prostej lub R
prawej.
LLSLRLS
SSSRRSRLLR
LLRLSR
RRRLLLL
Pierwszy rząd to skład przy północnym wejściu do skrzyżowania. Pierwszy samochód w kolejce chce skręcić w lewo (czyli zjechać na wschód). Kolejne rzędy dotyczą nadchodzących wejść na wschód, południe i zachód. Tak więc pierwszy samochód jadący z Zachodu chce zjechać na południe.
Ruch odbywa się w szeregu kroków. Na każdym kroku musisz wybrać podzbiór samochodów na początku ich linii, aby kontynuować. Wybrane samochody nie mogą kolidować ze sobą. Dwa samochody przeszkadzają, jeśli wyjeżdżają w tym samym kierunku lub muszą się przeciąć. Tak więc dwa przeciwległe samochody, oba chcące jechać prosto, mogą przejść ten sam krok. Może 4 samochody, które chcą skręcić w prawo. Dwa przeciwne samochody mogą jednocześnie skręcić w lewo.
Twoim zadaniem jest zaplanowanie skrzyżowania w minimalnej serii kroków. Dla każdego kroku wypisz linię z podanymi kierunkami kompasu przychodzących samochodów. W powyższym przykładzie minimalny harmonogram wynosi 14 kroków. Jeden minimalny harmonogram to:
N [L from North]
E [S from East]
E [S from East]
E [S from East]
NESW [L from North, R from East, L from South, R from West]
NE [S from North]
EW [R from East]
NESW [L from North, R from East, L from South, R from West]
W [L from West]
EW [L from East, L from West]
NESW [R from North, L from East, R from South, L from West]
NES [L from North, R from East, L from West]
NS [S from North, S from South]
SW [R from South, L from West]
Twój program powinien być w stanie obsłużyć 50 samochodów w każdej linii w czasie krótszym niż 1 minuta. Wprowadzanie 4 ciągów i wyjście harmonogramu może być dowolne dla twojego języka.
Najkrótszy program wygrywa.
Większy przykład:
RRLLSSRLSLLSSLRSLR
RLSLRLSLSSRLRLRRLLSSRLR
RLSLRLRRLSSLSLLRLSSL
LLLRRRSSRSLRSSSSLLRRRR
co wymaga minimum 38 rund. Jedno możliwe rozwiązanie:
E
EW
E
ESW
S
NS
ES
NESW
NSW
ESW
ES
NSW
NS
NS
NW
EW
NSW
NS
EW
NES
EW
NSW
NE
E
NE
EW
E
E
EW
EW
EW
W
ESW
NSW
NSW
NS
NSW
NEW
Odpowiedzi:
Python, 1219 bajtów
Nie spędziłem dużo czasu / wysiłku próbując zagrać w golfa, ale mogę to poprawić, jeśli pojawią się inne odpowiedzi. Korzystam z wyszukiwania A * z dopuszczalną heurystyką , co gwarantuje optymalność. Jestem całkiem pewien (chociaż nie zawracałem sobie głowy potwierdzeniem), że heurystyka jest również spójna , co oznacza, że jest to O (programowanie dynamiczne).
Program odczytuje w czterech wierszach STDIN w określonym formacie i drukuje wynik do STDOUT, również w określonym formacie.
Przykładowe użycie:
źródło