All pastes #768622 Raw Edit

Hanoi Towers

public text v1 · immutable
·published 2007-11-10 19:14 UTC
rendered paste body
program 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.