Hanoi dla 5 wież

0

Próbuję zrobić hanoi dla 5 wież i n krążków, jednak w jakiejkolwiek robię kombinacji, to nie wychodzi poprawnie.
Ostatecznie napisałem ręcznie, jednak nie to mi chodzi i chciałbym jakoś to uogólnić, jednak nie widzę zależności:

void hanoiPiecWiezy(int n, char A, char E, char B, char C, char D)
{
   if (n == 0)
       return;
   if (n == 1)
   {
      cout << A<<" " <<E<< endl;
      return;
   }
   else
	{

		if (n==2)
       {
           hanoiPiecWiezy(n-1, A, B,C,D,E);
            cout<<A << " " << D << endl;
            cout << B<<" " << D<< endl;
       }
       if (n==3)
       {
           hanoiPiecWiezy(n-1, A B,C,E,D);
           cout<<A<< " " <<E<<endl;
           cout<<D<< " "<< E <<endl;
           cout << C <<" " << E << enEdl;
       }
       if (n==4)
       {
           cout<<A << " " << B<<endl;
           cout<<A << " " << C<<endl;
           cout<<A << " " << D<<endl;
           cout<<A << " " << E<<endl;
           cout<<D << " "<< E <<endl;
           cout << C <<" " << E << endl;
           cout << B <<" " << E << endl;
       }
       if (n==5)
       {
           cout<<A  << " " << B<<endl;
           cout<<A << " " << C<<endl;
           cout<<B<< " " << C<<endl;
           cout<<A << " " << B<<endl;
           cout<<A  << " " << D<<endl;
           cout<<A << " " << E<<endl;
           cout<<D << " " << E<<endl;
           cout<<B << " " << E<<endl;
           cout<<C << " " << B<<endl;
           cout<<C<< " " << E<<endl;
           cout<<B << " " <<E<<endl;
       }


	}
}

Nie musi być po najmniejszej liczbie ruchów, byle skutecznie.
Tutaj moja niepoprawna próba uogólnienia tego algorytmu:

void hanoiPiecWiezy(int n, char A, char E, char B, char C, char D)
{
   if (n == 0)
       return;
   if (n == 1)
   {
      cout << A <<" " << E << endl;
      return;
   }

   hanoiPiecWiezy(n-3, A,B,C,D,E);
   cout<<A << " " << C << endl;
   cout<<A << " " << D << endl;
   cout<<A << " " << E << endl;
   cout << D << " "<< E << endl;
   cout << C << " "<< E << endl;
   hanoiPiecWiezy(n-3,B,E,A,C,D);

} 

Bo ta druga funkcja dobrze działa dla 3 i 4 krążków, jednak przy innych wyrzuca błąd

0
Spearhead napisał(a):

Dosłownie 3 tematy wyżej

Wyliczyć liczbę ruchów rozumiem i mam taką funkcję używając algorytmu Frame-Stewart, ale jednak nie mam pomysłu jak zapisać to do wypisywania ruch po ruchu, co na co jest przekładane. Staram się to zapisać w formie jak jest w tej drugiej funkcji.

0
hopeless napisał(a):

Próbuję zrobić hanoi dla 5 wież i n krążków, jednak w jakiejkolwiek robię kombinacji, to nie wychodzi poprawnie.
Ostatecznie napisałem ręcznie, jednak nie to mi chodzi i chciałbym jakoś to uogólnić, jednak nie widzę zależności:

void hanoiPiecWiezy(int n, char A, char E, char B, char C, char D)
{
   if (n == 0)
       return;
   if (n == 1)
   {
      cout << A<<" " <<E<< endl;
      return;
   }
   else
	{

		if (n==2)
       {
           hanoiPiecWiezy(n-1, A, B,C,D,E);
            cout<<A << " " << D << endl;
            cout << B<<" " << D<< endl;
       }
       if (n==3)
       {
           hanoiPiecWiezy(n-1, A B,C,E,D);
           cout<<A<< " " <<E<<endl;
           cout<<D<< " "<< E <<endl;
           cout << C <<" " << E << enEdl;
       }
       if (n==4)
       {
           cout<<A << " " << B<<endl;
           cout<<A << " " << C<<endl;
           cout<<A << " " << D<<endl;
           cout<<A << " " << E<<endl;
           cout<<D << " "<< E <<endl;
           cout << C <<" " << E << endl;
           cout << B <<" " << E << endl;
       }
       if (n==5)
       {
           cout<<A  << " " << B<<endl;
           cout<<A << " " << C<<endl;
           cout<<B<< " " << C<<endl;
           cout<<A << " " << B<<endl;
           cout<<A  << " " << D<<endl;
           cout<<A << " " << E<<endl;
           cout<<D << " " << E<<endl;
           cout<<B << " " << E<<endl;
           cout<<C << " " << B<<endl;
           cout<<C<< " " << E<<endl;
           cout<<B << " " <<E<<endl;
       }


	}
}

Nie musi być po najmniejszej liczbie ruchów, byle skutecznie.
Tutaj moja niepoprawna próba uogólnienia tego algorytmu:

void hanoiPiecWiezy(int n, char A, char E, char B, char C, char D)
{
   if (n == 0)
       return;
   if (n == 1)
   {
      cout << A <<" " << E << endl;
      return;
   }

   hanoiPiecWiezy(n-3, A,B,C,D,E);
   cout<<A << " " << C << endl;
   cout<<A << " " << D << endl;
   cout<<A << " " << E << endl;
   cout << D << " "<< E << endl;
   cout << C << " "<< E << endl;
   hanoiPiecWiezy(n-3,B,E,A,C,D);

} 

Bo ta druga funkcja dobrze działa dla 3 i 4 krążków, jednak przy innych wyrzuca błąd

Dobra, już poradziłem sobie

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