Rezolvare completă PbInfo #2527 hanoi

Turnurile din Hanoi este un joc matematic sau, dacă vreți, un puzzle. Este format din trei tije A, B și C și un număr variabil de discuri, de diferite diametre. Inițial discurile sunt așezate în ordine descrescătoare a diametrelor pe tija A, de la vârf către bază, astfel încât să formeze un turn.
Scopul jocului este acela de a muta toate discurile de pe tija A pe tija C folosind ca tijă intermediară tija B, respectând următoarele reguli:

  • la un moment dat doar un singur disc poate fi mutat
  • fiecare mutare constă în luarea celui mai de sus disc de pe o tija și mutarea acestuia pe o altă tijă
  • un disc cu diametrul mai mare nu poate fi poziționat deasupra unui disc cu diametrul mai mic.

Cerința

Dacă se cunoaște numărul n de discuri aflate pe tija A, să se determine șirul mutărilor necesare pentru ca toate discurile să fie mutate pe tija C.

Date de intrare

Fișierul de intrare hanoi.in conține pe prima linie numărul natural nenul n, ce reprezintă numărul de discuri aflat pe tija A.

Date de ieșire

Fișierul de ieșire hanoi.out va conține pe prima linie numărul m, ce reprezintă numărul minim de mutări ce se efectuează. Pe următoarele m linii vor fi scrise mutările sub forma: tija sursă->tija destinație.

Restricții și precizări

  • 1 ≤ n ≤ 15
  • mutările vor fi scrise câte una pe linie, fără spații

Exemplu

hanoi.in

2

hanoi.out

3
A->B
A->C
B->C

Explicație

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema hanoi:

# include <fstream>
using namespace std;

ifstream f("hanoi.in");
ofstream g("hanoi.out");

char a, b, c;
int n;

void Hanoi (int n, char a, char b, char c){
    
    if (n == 1) g << a << "->" << c << "\n";
    else {
        Hanoi(n-1, a, c, b);
        g << a << "->" << c << "\n";
        Hanoi(n-1, b, a, c);
    }
}

int main(){

    f >> n;

    g << (1 << n) - 1 << "\n";
    Hanoi(n, 'A', 'B', 'C');

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2527 hanoi

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2527 hanoi de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!