rendered paste bodyprogram lab_1_1_3;{ This program solves the Tower of Hanoi puzzle Matyushin Vyacheslav (group 07-PO1)}const N = 10; type circle_array = array [1..N] of Integer;procedure PrintArray (a : circle_array);var i : Integer;begin for i := 1 to N do Write (a[i],' '); Writeln;end; { PrintArray }procedure PrintArrays (a, b, c : circle_array);begin Write ('A: '); PrintArray (a); Write ('B: '); PrintArray (b); Write ('C: '); PrintArray (c); Writeln;end; { PrintArrays }function ArrayIsEmpty (a : circle_array) : boolean;var i, flag : Integer;begin flag := 0; for i := 1 to N do begin if a[i] <> 0 then begin flag := 1; break; end; end; if flag = 0 then ArrayIsEmpty := true else ArrayIsEmpty := false;end; { ArrayIsEmpty }function ArrayHeigth (a : circle_array) : Integer;var i, flag : Integer;begin flag := 0; if ArrayIsEmpty (a) then ArrayHeigth := 0 else begin for i := 1 to N do if a[i] = 0 then begin ArrayHeigth := i - 1; flag := 1; break; end; if flag = 0 then ArrayHeigth := N; end;end; { ArrayHeigth }procedure Swap (var a, b : circle_array);var ha, hb : Integer;begin ha := ArrayHeigth (a); hb := ArrayHeigth (b); if (ha = 0) and (hb <> 0) then begin a[1] := b[hb]; b[hb] := 0; end; if (hb = 0) and (ha <> 0) then begin b[1] := a[ha]; a[ha] := 0; end; if a[ha] < b[hb] then begin b[hb + 1] := a[ha]; a[ha] := 0; end; if b[hb] < a[ha] then begin a[ha + 1] := b[hb]; b[hb] := 0; end;end; { Swap }procedure Solve (var a, b, c : circle_array; var d : Integer);{moving right: d = 1, moving left: d = 0}var ha, hb, hc : Integer;begin ha := ArrayHeigth (a); hb := ArrayHeigth (b); hc := ArrayHeigth (c); if (ha = 0) and (hb = 0) then Writeln ('Finished') else if d = 1 then begin c[hc + 1] := a[ha]; a[ha] := 0; PrintArrays (a, b, c); b[hb + 1] := a[ha - 1]; a[ha - 1] := 0; PrintArrays (a, b, c); b[hb + 2] := c[hc + 1]; c[hc + 1] := 0; PrintArrays (a, b, c); c[hc + 1] := a[ha - 2]; a[ha - 2] := 0; PrintArrays (a, b, c); a[ha - 2] := b[hb + 2]; b[hb + 2] := 0; PrintArrays (a, b, c); c[hc + 2] := b[hb + 1]; b[hb + 1] := 0; PrintArrays (a, b, c); c[hc + 3] := a[ha - 2]; a[ha - 2] := 0; PrintArrays (a, b, c); Swap (a, b); d := 0; PrintArrays (a, b, c); Solve (a, b, c, d); end else begin a[ha + 1] := c[hc]; c[hc] := 0; PrintArrays (a, b, c); b[hb + 1] := c[hc - 1]; c[hc - 1] := 0; PrintArrays (a, b, c); b[hb + 2] := a[ha + 1]; a[ha + 1] := 0; PrintArrays (a, b, c); a[ha + 1] := c[hc - 2]; c[hc - 2] := 0; PrintArrays (a, b, c); c[hc - 2] := b[hb + 2]; b[hb + 2] := 0; PrintArrays (a, b, c); a[ha + 2] := b[hb + 1]; b[hb + 1] := 0; PrintArrays (a, b, c); a[ha + 3] := c[hc - 2]; c[hc - 2] := 0; PrintArrays (a, b, c); Swap (b, c); d := 1; PrintArrays (a, b, c); Solve (a, b, c, d); end;end; { Solve }var a, b, c : circle_array; i, direction : Integer; begin Writeln ('Number of circles: ', N); for i := 1 to N do begin a[i] := N - i + 1; b[i] := 0; c[i] := 0; end; direction := 1; PrintArrays (a, b, c); Solve (a, b, c, direction);end.