Jaś zastanawia się w ile ruchów może dojść na metę w grze Węże i Drabiny. Napisz program, który pomoże Jasiowi znaleźć odpowiedź dla dowolnej planszy jaką tylko sobie wymyśli.
Gra polega na wylosowaniu kostką wartości o ile pól do przodu ma się poruszyć gracz. Wygrywa ten kto jako pierwszy dotrze na ostatnie pole. Na planszy znajdują się drabiny oraz węże, które łączą dwa pola na planszy. W momencie, gdy stanie się na dół drabiny to należy przejść na jej szczyt, a jeśli stanie się na ogon węża to ssssspada się na pole wskazane przez głowę węża.
Przykładowo na powyższej planszy można przeskoczyć z pola 5 na 8, albo spaść z 6 na 1. Grając kostką do gry K3 (można wylosować tylko 1, 2, 3) to grę można ukończyć w 3 ruchy tj. 1 - 4 - (5 - 8) - 9, ale nie można 1 - 4 - 6 - 9.
Zadanie można rozwiązać rekurencyjnie. W każdym wywołaniu symulujemy przejście o 1, 2, .., 6 pól do przodu. Algorytm kończy działanie, gdy dotrze na linie mety. Należy jednak pamiętać, aby zapobiec nieskończonej rekurencji, ponieważ każdy wąż (tj. cofnięcie) tworzy nieskończony cykl. Można tego uniknąć poprzez wykrycie, że następne pole jest wcześniej niż aktualne.
Na podstawie przekazanego rozmiaru planszy n oraz przejść tworzona jest tablica, która na i-tej pozycji ma zapisane faktyczne pole docelowe po przejściu na nie. W przypadku zwykłego pola na i-tej pozycji jest i, ale dla ogona węża czy początku drabiny wartością będzie pole docelowe przejścia. Funkcja zwraca wynik wyszukiwania ruchu.
Funkcja szukajRuchow() sprawdza kolejne, możliwe ruchy i jako wynik podaje najmniejszy podwynik z dalszych wywołań. Jako argumenty wymaga podania: n - rozmiar planszy, przejscia - przygotowana tablica przejść, teraz - aktualny numer pola oraz ruchow - ile ruchów do tej pory wykonano.
Warunkiem stopu rekurencji jest osiągnięcie pola docelowego. Dla pozostałych pól należy zasymulować ruch o każdą możliwą wartość.
Do przetestowania napisanego kodu można skorzystać z poniższego fragmentu programu:
Przykładowo, aby wprowadzić planszę pokazaną na początku artykułu należy wpisać (pola indeksujemy od 0):