uses
CRT;
const
Max = 20;
A = 'A';
B = 'B';
C = 'C';
type
Stack = 1..Max;
Disk = 0..Max;
Tower = object
Depth : integer;
V : array[Stack] of Disk;
constructor Init(N : integer);
procedure Add(D : Disk);
function Remove : Disk;
procedure Print;
end;
constructor Tower.Init(N : integer);
var
I : Disk;
begin
Depth := N;
for I := 1 to N do V[I] := I;
for I := succ(N) to Max do V[I] := 0;
end;
procedure Tower.Add(D : Disk);
begin
Depth := succ(Depth);
V[Depth] := D;
end;
function Tower.Remove : Disk;
begin
Remove := V[Depth];
Depth := pred(Depth);
end;
procedure Tower.Print;
var
I : Stack;
begin
clreol;
for I := 1 to Depth do write(V[I]:3);
end;
type
Hanoi = object
Display : boolean;
Pause : boolean;
S : Stack;
H : array[A..C] of Tower;
constructor Init(I : Stack; On : boolean; Wait : boolean);
procedure Move( N : integer; var Source, Sink, Using : Tower);
procedure Transfer;
procedure Print;
end;
constructor Hanoi.Init(I : Stack; On : boolean; Wait : boolean);
begin
if I < Max then S := I else S := Max;
Display := On;
Pause := Wait;
H[A].Init(S);
H[B].Init(0);
H[C].Init(0);
end;
procedure Hanoi.Move(N : integer; var Source, Sink, Using : Tower);
var
F : char;
begin
if N > 0 then
begin
Move(N-1, Source, Using, Sink);
Sink.Add(Source.Remove);
if Display then
begin
Print;
if Pause then
begin
repeat until keypressed;
F := readkey;
end;
end;
Move(N-1, Using, Sink, Source);
end;
end;
procedure Hanoi.Print;
var
X : A..C;
begin
for X := A to C do
begin
gotoxy(1,ord(X) - Ord(A) + 1);
H[X].Print;
end;
end;
procedure Hanoi.Transfer;
begin
Move(S, H[A], H[B], H[C]);
end;
var
T : Hanoi;
begin
clrscr;
with T do
begin
Init(6,true,true);
Transfer;
end;
end.