Sunteți pe pagina 1din 2

Turnul din Hanoi

Turnul din Hanoi sau Turnurile din Hanoi este un joc matematic saupuzzle. Este format din trei tije i un numr variabil de discuri, de diferite mrimi, care pot fi poziionate pe oricare din cele 3 tije. Jocul ncepe avnd discurile aezate n stiv pe prima tij, n ordinea mrimii lor, astfel nct s formeze un turn. Scopul jocului este acela de a muta ntreaga stiv de pe o tij pe alta, respectnd urmtoarele reguli:

Doar un singur disc poate fi mutat, la un moment dat. Fiecare mutare const n luarea celui mai de sus disc de pe o tija i glisarea lui pe o alt tij, chiar i deasupra altor discuri care sunt deja prezente pe acea tij.

Un disc mai mare nu poate fi poziionat deasupra unui disc mai mic.

Fie trei tije verticale notate A,B,C .Pe tija A se gasesc asezate n discuri de diametre diferite ,in ordinea crescatoare a diametrelor,privind de sus in jos . Initial ,tijeleB si C sunt goale .Sa se afiseze toate mutarile prin care discurile de pe tija A se muta pe tija B , in aceeasi ordine ,folosind ca tija de manevra C si resspectand urmatoarele reguli: la fiecare pas se muta un singur disc; un disc se poate aseza numai peste un disc cu diametrul mai mare . Rezolvarea acestei considerente logice : B); daca n=2,atunci sirul mutarilor este : AC,AB,CB; daca n>2 procedam astfel : -mut (n-1)discuri AC; -mut un disc AB ; -mut cele (n-1)discuri CB. Observam ca problema initiala se descompune in trei subprobleme mai simple ,similare problemei initiale: mut (n-1)discuri AC ,mut ultimul disc pe B ,mut cele (n-1)discuri C-->B.Dimensiunile acestor subprobleme sunt : n-1,1,n-1. probleme se bazeaza pe urmatoarele

-daca n=1 ,atunci mutarea este immediata AB(mut discul de pe A pe

Aceste subprobleme sunt independente ,deoarece tijele initial (pe care sunt dispuse discurile ),tijele finale si tijele intermediare sunt diferite.Notam H(n,A,B,C)=sirul mutarilor a n discuri de pe A pe B, folosind C.

PENTRU n=1 AB n>1 H(n,A,B,C)=H(n-1,A,C,B),AB, H(n1,C,B,A)

program turnurile _hanoi;


var n:byte; procedure hanoi(n:byte;a,b,c:char); begin if n=1 then writeln(a,,b) else begin hanoi(n-1,a,c,b); writeln(a,,b); hanoi(n-1,c,b,a); end; end; begin write(nr discuri pe tija A =);readln(n); writeln(mutarile sunt urmatoarele :); hanoi(n,A,B,C); readln;readln; end.