Zadání:
Rekursivní řešení založíme na tom, že problém s N disky bude řešen, když:
{Program pro generovani tahu v uloze o hanojskych vezich.
Zadava se pocet disku. Presun probiha z veze cislo 1 na vez cislo 3
s uzitim pomocne veze cislo 2.}
uses crt;
const Koncovky: array[1..5] of string[1]=('','y','y','y','u');
var Odkud, {Cislo puvodni veze}
Kam, {Cislo konecne veze}
Pomocna, {Cislo pomocne veze}
Pocet:byte; {Pocet disku}
Koncovka:string[1];
procedure Tah(Odkud,Kam:byte);
{Procedura vypise, odkud budeme tahnout a kam}
begin {Tah}
writeln('Tah z ',Odkud,' na ',Kam)
end; {Tah}
Procedure PosunVez(Vyska:byte;var Odkud,Kam,Pomocna:byte);
{Rekurzivni procedura pro reseni ulohy hanojskych vezi}
begin {PosunVez}
if Vyska>0 then begin
PosunVez(Vyska-1,Odkud,Pomocna,Kam);
Tah(Odkud,Kam);
PosunVez(Vyska-1,Pomocna,Kam,Odkud);
end; {if}
end; {PosunVez}
begin
clrscr;
Odkud:=1;
Kam:=3;
Pomocna:=2;
writeln('Hanojske veze');
writeln;
repeat
{$I-} {Vypnuti konroly V/V operaci}
repeat
write('Zadejte pocet disku v intervalu <0,4> (0 ukonci program): ');
readln(Pocet);
Koncovka:=Koncovky[Pocet];
until (IOResult=0)and(Pocet in [0..4]);
{$I+} {Zapnuti konroly V/V operaci}
if Pocet<>0 then begin
clrscr;
writeln('HANOJSKE VEZE - tahy pro ',Pocet,' disk',Koncovka);
writeln('____________________________________');
PosunVez(Pocet,Odkud,Kam,Pomocna);
writeln;
end; {if}
until Pocet=0;
end.
|
|
12. 2. 2000 |
|
|
||
|
|