Zadanie 03: Tezeusz
Algorytmy Matematyki Dyskretnej
Tezeusz pokonał Minotaura i chce wyjść z Labiryntu. Niestety na skutek nieszczęśliwego wypadku, nić Ariadny zerwała się i bohater nie może tak łatwo wydostać się na wolność.
Starożytni Grecy uwielbiali wielokąty foremne, więc cały labirynt składa się z kwadratowych płytek.
Jeśli pomiędzy dwoma płytkami istnieje przejście, to można przejść tamtędy w obie strony.
Dzięki kreteńskiemu archiwum masz informacje o budowie labiryntu. Udało Ci się uzyskać informacje, pomiędzy którymi płytkami istnieje możliwość przejścia. Dodatkowo znaleziono zapiski, które zawierają informacje o płytkach, z których można opuścić labirynt.
Twoim zadaniem jest napisać metodę, która powie Tezeuszowi jak opuścić Labirynt:
list<int> EscapeLabyrinth(Labyrinth labyrinth);
// gdzie klasa Labyrinth udostępnia metody:
// getWidth(), getHeight() - wymiary labiryntu,
// getTheseus() - numer płytki na której znajduje się Tezeusz,
// getPassages() - lista par, która zawiera numery par płytek pomiędzy którymi istnieje przejście, // getEscapes() - lista numerów płytek z których można opuścić labirynt.
// returns:
// Metoda powinna zwrócić kolejne numery płytek, które powinien odwiedzić Tezeusz, żeby opuścić Labirynt (lista powinna zaczynać się od płytki na której znajduje się Tezeusz, a kończyć na płytce z której można opuścić Labirynt. Jeśli Tezeusz może od razu opuścić Labirynt należy podać tylko numer tej płytki). Pomiędzy każdymi dwoma kolejnymi płytkami na liście musi istnieć przejście. Jeśli nie istnieje droga wyjścia z Labiryntu należy zwrócić pustą listę.
PRZYKŁAD:
0 1 2 3 4 5 6 7 8 9 10 11 T 13 14 15 16 17 18 19 20 21 22 23 24
W powyższym labiryncie Tezeusz znajduje się na płytce oznaczonej numerem 12 (litera T). Pogrubione ściany na powyższym schemacie oznaczają brak przejścia pomiędzy płytkami. Przykładowo, możliwe jest przejście z płytki 6 → 11 i z 11 → 6.
Rozwiązanie: 12, 7, 8, 3 (istnieje też inne rozwiązanie, ale docelowo szukamy najkrótszej drogi).
UWAGI:
1. Labirynt nie musi być kwadratowy (może być prostokątny).
2. W zadaniu została dostarczona metoda PrintLabyrinth, która na konsoli wypisuje budowę labiryntu.
Może być przydatna do debugowania lub na etapie opracowania rozwiązania.
PUNKTACJA:
3p. Metoda poprawnie zwraca drogę wyjście z labiryntu
0.5p. Metoda poprawnie zwraca informację o braku wyjścia z labiryntu.
1p. Metoda zwraca najkrótszą drogę (pod względem ilości pokonanych płytek) z labiryntu.
0.5p. Metoda rozwiązuje nie tylko kwadratowe labirynty.
+?p. Dodatkowe punkty za rozwiązania częściowe (do decyzji prowadzącego).
PRZESŁANIE ZADANIA:
Na koniec laboratorium należy przesłać rozwiązanie na adres krzeszewskip@student.mini.pw.edu.pl. Rozwiązanie należy spakować do archiwum o nazwie zgodnej z uczelnianym loginem. Temat maila: [AMD]
Zadanie 03.