Dwukolorowa wieża hanoi

0

Witajcie, mam problem, dostałem do zrobienia projekt z wieżą Hanoi ale dwukolorową.
Robię zwykła rekurencyjnie ale nie wiem za chiny jak zrobić dwukolorową, nic nie moge nawet znalezc na ten temat, pomożcie mi to wykonac, a chodzi o to:

**Zadanie polega na rozdzieleniu stosu krążków o różnych wielkościach i dwóch kolorach (białym i czarnym) na oddzielne wieże. Dla każdej wielkości mamy dwa krążki odpowiednio koloru białego i czarnego.
Początkowo wszystkie krążki ułożone są od największego do najmniejszego rozmiaru na jednej wieży naprzemiennie kolorami.
W wyniku działania programu wszystkie białe krążki powinny znajdować się na jednej z wież, natomiast wszystkie czarne na innej.
Program powinien opisać wykonywane ruchy wg następującego schematu – każdy wiersz zawiera informacje o jednym ruchu w postaci dwóch liczb rozdzielonych spacją z numerem wieży początkowej i docelowej (zakładamy że wieże numerowane są 1,2,3)
**

0

Jeśli masz n krążków (gdzie n jest podzielne przez 2) na wieży 1, ułożone od dołu czarne, białe, czarne, białe itd..., i pod koniec chcesz mieć czarne krążki na wieży 1, a białe na wieży 2, to coś takiego wystarczy:

przenieść n-1 krążków z 1 do 2
przenieść n-2 krążków z 2 do 1
przenieść n-3 krążków z 1 do 2
przenieść n-4 krążków z 2 do 1
....

Zakładam, że napisałeś zwykłą wersję, więc masz już implementację przenieść

0
//To jest moj kod na zwykla wieze ktora mam napisana:
#include <iostream>

using namespace std;

void hanoi(int licznik,int n1,int n3,int n2)
{
    if (licznik>0)

    {
        hanoi(licznik-1,n1,n2,n3);
        cout<<"Przenies dysk " << licznik << " z "  << n1 << " do " << n3 <<"."<<endl;
        hanoi(licznik-1,n2,n3,n1);
    }
}

int main()
{
    int ile;
    cout<<"Ile dyskow podac: "<<endl;
    cin>>ile;
    hanoi(ile,1,3,2);


    return 0;
}
0

No to wystarczy podstawić hanoi() do przenieść i masz.

0

Mimo że napisałeś mi podstawić to pod to, to i tak nie wiem co pod co ... ;/

0

przenieść n-1 krążków z 1 do 2 oznacza w tym przypadku

hanoi(ile - 1, 1, 2, 3);

Pytanie czy w pełni rozumiesz ten kod, który masz.

0

napisalem sobie troszke latwiejszy kod przed chwila dla zwyklej ale tak rozumiem jak działa zwykla wieza, to co wkleilem

0

Zmienilem troche kod na czytelniejszy dla mnie i z pomoca googli, gdzie beg - slupek poczatkowy , aux-slupek posredni , end-slupek docelowy

#include <iostream>

using namespace std;

void t(int n, char beg,char aux,char end);

int main()
{
    cout<<"Moves\n"<<endl;
    t(3,'a','b','c');

    return 0;
}

void t(int n,char beg,char aux,char end)
{
if(n==1)
    {
        cout<<beg <<" -> " << end <<endl;
    }
    else
    {
        t(n-1,beg,end,aux);
        t(1,beg,aux,end);
        t(n-1,aux,beg,end);
    }


}

Tutaj ponizej to mam tak jak pisales z podzielnoscia to idzie na poszczegolne slupki ale nie wiem gdzie to wsadzic

if(n%2==0)
    {
        t(n-1,beg,end,aux);
        
    }
    else
    {
        t(n-1,aux,end,beg);
    }
0
cout<<"Moves\n"<<endl;
cin >> n;
while (n > 0)
{
    if (n % 2 == 0)
        t(n-1, 'a', 'b', 'c');
    else
        t(n-1, 'b', 'a', 'c');
    --n;
}
0

Jezeli ta petle wrzuce do main to i tak wyrzuca blad pod wypisaniu ale wypisac tez zle wypisuje bo np dla 3 krazkow daje:
b-a
b-c
a-c
a-c

0

To nie rozumiem czemu tutaj są błędy :

#include <iostream>

using namespace std;

void t(int n,int n1,int n3,int n2)
{
while (n > 0)
{
if (n % 2 == 0)
{
t(n-1, 'a', 'b', 'c');
cout<<"Przenies dysk " << n << " z " << n1 << " do " << n3 <<"."<<endl;
}
else
{
t(n-1, 'b', 'a', 'c');
cout<<"Przenies dysk " <<n << " z " << n1 << " do " << n3 <<"."<<endl;
}
--n;
}
}

int main()
{
int n;
cout<<"Ile dyskow podac: "<<endl;
cin>>n;
t(n,1,3,2);

return 0;

}

0
''** #include <iostream>

using namespace std;

void t(int n,int n1,int n3,int n2)
{
    while (n > 0)
    {
    if (n % 2 == 0)
       {
         t(n-1, 'a', 'b', 'c');
          cout<<"Przenies dysk " << n << " z "  << n1 << " do " << n3 <<"."<<endl;
       }
    else
        {
         t(n-1, 'b', 'a', 'c');
         cout<<"Przenies dysk " <<n << " z "  << n1 << " do " << n3 <<"."<<endl;
        }
    --n;
    }
}

int main()
{
    int n;
    cout<<"Ile dyskow podac: "<<endl;
    cin>>n;
   t(n,1,3,2);


    return 0;
}
**"
```cpp
 
``` ``` ``` ``` ``` ``` ``` >

```cpp
 
0
jimmy18 napisał(a):

np dla 3 krazkow daje

Skoro n ma być parzyste to co się dziwisz, że program durnieje przy "parzystej" 3?

Oczywiście jest też bug w tym co napisałem, bo nie popatrzyłem dokładnie na kolejność argumentów. Powinno być:

while (n > 1)
{
    if (n % 2 == 0)
        t(n-1, 'a', 'c', 'b');
    else
        t(n-1, 'b', 'c', 'a');
    --n;
}

I to ma być w main. Jaki sens ma wrzucenie tego do funkcji hanoi, która teraz bezsensownie się nazywa t?

0

Nawet uwzględniając Twoją poprawioną pętle, zmieniając nazwę funkcji na bezsensowną hanoi to i tak nic to nie daje. Nie wiem gdzie już jest w tym błąd. Ale ja otrzymuję coś takiego.
eaa7f4204a.png
kod:

#include <iostream>

using namespace std;

void hanoi(int n,int n1,int n3,int n2)
{
    while (n > 0)
    {
    if (n % 2 == 0)
       {
         hanoi(n-1, 'a', 'b', 'c');
          cout<<"Przenies dysk " << n << " z "  << n1 << " do " << n3 <<"."<<endl;
       }
    else
         hanoi(n-1, 'b', 'a', 'c');
         cout<<"Przenies dysk " <<n << " z "  << n1 << " do " << n3 <<"."<<endl;
    --n;
    }
}

int main()
{
    int n;
    cout<<"Ile dyskow podac: "<<endl;
    cin>>n;
   hanoi(n,1,3,2);
   while (n > 1)
{
    if (n % 2 == 0)
        hanoi(n-1, 'a', 'c', 'b');
    else
        hanoi(n-1, 'b', 'c', 'a');
    --n;
}
    return 0;
}
0

Bo źle przepisałeś funkcję hanoi. Implementacja @jimmy18 była ok. Pomyśl, jaki sens ma pętla while w tej funkcji?

0
twonek napisał(a):

Bo źle przepisałeś funkcję hanoi. Implementacja @jimmy18 była ok. Pomyśl, jaki sens ma pętla while w tej funkcji?

Ja rozumiem, co robi while, tylko nie widzę jego spełnienia w tym programie, gdyż po ciągłych poprawkach i tak mi cuda wypisuje, a nie takie było założenie. Dlatego zastanawia mnie gdzie jest kluczowy błąd.

0

To się zgadza zwykła hanoi działa, ale chyba nie rozumiesz celu tego projektu. Mamy dane np 4 krążki. Dwa tej samej wielkości biały i czarny oraz dwa większe też tej samej wielkości biały i czarny. Mamy tak przerobić program, aby układał piramidki kolorami. W tym momencie zwykła hanoi tego nie robi- to logiczne jest napisana dla jednego koloru.
Więc w przypadku 4 klocków tych ruchów jest 8.
Dlatego jednak według mnie musi być jakiś while lub inna funkcja, która pozwoli na rozróżnienie wielkości tych klocków

0

Omujborze! Macie: http://ideone.com/tSRPVf

1

@twonek
Definicja słowa nudziarz - to człowiek któremu łatwiej się oddać niż wytłumaczyć że go nie chcesz.

0
twonek napisał(a):

Omujborze! Macie: http://ideone.com/tSRPVf

Tak abyś zobaczył, że moje słowa nie są puste, przepisz sobie listę przekładań do tego programu.
http://math.uni.lodz.pl/~lindner/ wystarczy pobrać test, jest to wizualizacja i sam przekonasz się gdzie masz błąd w programie dla 4 klocków.
Ale dzięki za kod. Mimo wszystko.

0

Chyba za bardzo się nudzę, bo pobrałem i taki mam wynik:
032d29ce99.png

Chętnie posłucham gdzie mam błąd.

0

Intrygująca konwersacja. Nie został ruszony krążek z pierwszej wieżyczki ten na samym dole. A w zasadach tej durnej gry jest, że każdy klocek musi być chociaż raz przełożony.

0

No to wskaż mi post w tym wątku, gdzie był opisany ten warunek. I jak zmienić program, żeby spełniał ten warunek zostawię Wam.

0

Nie potrzebne te frustracje, ponieważ nikt też nie wiedział, że możesz nie znać zasad wierzy z Hanoi. Po to była ta wizualizacja, aby wyjaśnić niepotrzebne niedomówienia.

0

Klasyczny problem wież hanoi NIE ZAWIERA warunku na konieczne poruszenie każdego krążka.

0
Shalom napisał(a):

Klasyczny problem wież hanoi NIE ZAWIERA warunku na konieczne poruszenie każdego krążka.

Jeśli nawet pominiemy ten problem, to program wywala się przy 6 klockach. Najlepiej widać to na wizualizacji.

0

Ale żeby go zrobić w ogóle nawet dla 4 klocków i dobrze by działał a tak niestety się nie udaje, po różnych kombinacjach

0
Krzywy Kaczor napisał(a):

Jeśli nawet pominiemy ten problem, to program wywala się przy 6 klockach. Najlepiej widać to na wizualizacji.

Nadal tego nie widzę:
317c72434d.png

0

dostałem taka wersje na dwukolorowa wieze, mozecie popatrzec bo program mi sie wysypuje na niej ale podobno dziala tyle ze jest to wersja najgorsza tego algorytmu:

void hanoi(int n, int source, int dest, int spare) {
    hanoi(2*n,source,dest,spare);
    for(int i=(2*n)-1;i>=1;i=i-2)
    {
    hanoi(i,dest,spare,source);
    hanoi(i-1,spare,dest,source);
    }
}
0
twonek napisał(a):
Krzywy Kaczor napisał(a):

Jeśli nawet pominiemy ten problem, to program wywala się przy 6 klockach. Najlepiej widać to na wizualizacji.

Nadal tego nie widzę:
317c72434d.png

Czegoś tu nie rozumiem: jak przy błędnych wynikach możesz wklejać nam screeny z dobrze przeliczonego programu testującego? Bo jak rozumiem, są to wyniki z kodu znajdującego się tutaj: http://ideone.com/tSRPVf
Albo to nie ten kod, albo próbujesz mocno pozostałe osoby strollować.

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