wieze hanoi- trudniejsza wersja

0

Pisze wieze hanoi w C,tyle ze troche trudniejsza wersje i w pewnym momencie sie zatrzymalam i nie wiem zupelnie jak to zrobic.

Po pierwsze moj program musi dzialac dla wiecej niz 3 wiez (da sie znaleŹĆ w internecie taki algorytm wiec to jeszcze nie problem)

Ale nie zaczyna ze standardowym ustawieniem(czyli ze wszystkie krazki sa na jednym słupku),tylko wczytuje ustawienie krazkow z pliku tekstowego.
Czyli np:
dla 4 palików i 8 krążków może to wyglądać następująco:

|          |          |             |
|          4          |            | 
2         6           |            5
3         7          8            1

Zakładamy ze ustawienie krążków w pliku jest poprawne(tzn że większy krążek nie leży na mniejszym).

Kompletnie nie wiem jak ten algorytm przestawiania krążków powinien wyglądać w tej sytuacji.
Rozrysowywałam sobie na kartce różne przypadki i szukałam jakiś zależności,ale jak juz znalazłam jakąś metodę, to dla kolejnego przypadku kompletnie sie nie sprawdzała....

Może ktoś ma pomysł jak to zrobić,nie chodzi mi nawet o implementacje,ale jakieś wskazówki.

0

fajny problem, ale mógłbyś go troche precyzyjniej opisać, tzn. wszystkie krążki mają ostatecznie znaleźć się gdzie? Na n-tym pręcie, na dowolnym z n prętów? Poza tym co w ogóle chcesz osiągnąć? Program który wypisuje ciąg ruchów prowadzących do konfiguracji końcowej (optymalny tj. nakrótszy ciąg ruchów? A może dowolny? :-P ), a może program który oblicza liczbę ruchów do końca (chociaż w tej wersji problemu chyba na jedno wychodzi...)[???]

Na dodatek jeśli średnice krążków utożsamiłeś z liczbami to twój rysunek kuleje bo chyba 5 nie może leżeć na 1.

0

Tak racja, pomyłka z krążkami -oczywiscie powinno byc odwrotnie czyli 1 na 5.

To jest czesc mojego projektu wiec generalnie sporo rzeczy moge zrobic dowolnie.Wiec krazki ostatecznie moga znalezc sie albo na n-tym słupku albo na dowolnym -zreszta to chyba nie robi wielkiej roznicy. Wiadomo ze najbardziej zalezaloby mi na najkrotszym ciagu ruchow;), ale to nie jest konieczne.Jesli wymyslilabym sposob na jakakolwiek skuteczna droga to i tak byloby super. A obliczanie ruchow do konca no to przy okazji mozna zrobic.

Na poczatku myslalam ze da sie to zrobic w ten sposob: sprawdzic to wczytane ustawienie krażkow pod kątem algorytmu rozwiazania zwyklych wiez hanoi dla wiecej niz 3 słupku- to znaczy wyłapać moment w którym ustawienie krażków jest identyczne a pozniej leciec dalej tym algorytmem. Ale to by dla bardzo niewielu sytuacji moglo sie sprawdzic, bo chyba niewiele razy to ustawienie byloby jakims cyklem z tego algorytmu.
Troche zawile to pisze ale sama sie gmatwam w tym juz i coraz bardziej wydaje mi sie ze to nie do zrobienia:/

0

1-szy sposób:

Wyszukujemy wieżę na której leży 1-ka. Znajdujemy dla tej wieży maksymalną liczbę N, taką że N kolejnych krążków (począwszy od 1-ki) się na niej znajduje (np dla 7 5 3 2 1 będzie to 3). Z tej wieży przesówamy N krążków na wieżę na której znajduje się krążek N+1. Powaarzamy czynność do momentu kiedy wszystkie krązki będą na 1 wieży.

Pisałaś że znalazłaś rozwiązanie przenoszenia N uporządkowanych krązków więc nie będę tego opisywał. (Ten algorytm nie znajduje rozwiązania optymalnego)

2-gi sposób:

Proste przeszukiwanie przestrzeni stanów. Stanowi w którym wszystkie krążki są na jednej wieży nadajesz wartość 0. Każdemu stanowi do którego można przejść ze stanu 0 nadajesz wrtość 1, każdemu(z wyjątkiem stanu 0) do którego można dojść ze stanu 1 nadajesz wartość 2 itd. Kiedy osiągniesz stan wejściowy za pomocą stworzonej struktóry odtwarzasz scieżkę przejść. (Znajduje rozwiązanie optymalne, ale zapotrzebowanie algorytmu na pamięć i czas są bardzo duże (exp)).

3-ci sposób:

Znalezienie jakiegoś sposobu heurystycznego (będącego najpewniej wariacją sposobu 1-go).

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1