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 .
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!