PROBLEMA TURNURILOR
DIN
Prezentarea algoritmului rezolvarii
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 ,tijele B 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 probleme se bazeaza pe urmatoarele considerente logice :
-daca n=1 ,atunci mutarea este immediata A B(mut discul de pe A pe B);
daca n=2,atunci sirul mutarilor este : A C,A B,C B;
daca n>2 procedam astfel :
-mut (n-1)discuri A C;
-mut un disc A B ;
-mut cele (n-1)discuri C B.
Observam ca problema initiala se descompune in trei subprobleme mai simple ,similare problemei initiale: mut (n-1)discuri A C ,mut ultimul disc pe B ,mut cele (n-1)discuri C-->B.Dimensiunile acestor subprobleme sunt : n-1,1,n-1.
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 A B
n>1 H(n,A,B,C)= H(n-1,A,C,B),AB, H(n-1,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.