program Hanoi; const n = 3; type zakres = 1..n; type pelnyzakres = 0..n; type kolek = record stan : array [zakres] of zakres; top : pelnyzakres; name : char end; var X, Y, Z : kolek; procedure druk; { drukuje aktualne rozmieszczenie kregow na kolkach } var i : zakres; procedure druk_1(linia: zakres; var k:kolek); var i : zakres; begin if k.top < linia then begin for i:= 1 to n do write(' '); write(' ',k.name,' '); for i:= 1 to n do write(' ') end else begin for i:= n downto 1 do if k.stan[linia] < i then write(' ') else write('o'); write(' ',k.name,' '); for i := n downto 1 do if k.stan[linia] < n-i+1 then write(' ') else write('o') end end; { druk_1 } begin for i:= n downto 1 do begin druk_1(i, X); write(' '); druk_1(i, Y); write(' '); druk_1(i, Z); writeln end; writeln end; { druk } procedure genpusty(var K : kolek; name : char); begin k.top:=0; k.name:=name end; { genpusty } procedure genpelny(var K : kolek; name : char); var i : zakres; begin k.top := n; for i:= 1 to n do k.stan[i] := n+1-i; k.name:=name end; { genpelny } procedure przenies_1(var z,na : kolek); begin na.top := na.top+1; na.stan[na.top] := z.stan[z.top]; z.top:= z.top-1; druk end; { przenies_1 } procedure przenies (ile:pelnyzakres; var z, na, przez:kolek); begin if ile > 0 then begin przenies(ile-1, z,przez,na); przenies_1(z,na); przenies(ile-1,przez,na,z); end end; { przenies } begin writeln; genpelny(x,'X'); genpusty(y,'Y'); genpusty(z,'Z'); druk; przenies(n,x,z,y) end.