program Vexier; { Das Hauptprogramm ist ganz unten ! }
const
oben = TRUE; {oben heisst, der Ring sitzt noch AUF dem Bügel bzw. ist noch aufgespiesst}
unten = FALSE; {unten heisst, der Ring ist frei, d.h. ausserhalb des Bügels}
var
Ring: array[1..7] of BOOLEAN; { Nummern von links nach rechts in der Abbildung }
AnzahlBewegungen: integer;
procedure Print_AktuellenZustand;
var i: integer;
begin
write(AnzahlBewegungen : 3, ' ');
for i := 1 to 7 do
if Ring[i] = oben then
write('O ')
else write('U ');
writeln; { Zeilenwechsel }
end; { Print_AktuellenZustand }
procedure RingNachUnten (nr: integer);
forward;
procedure RingNachOben (nr: integer);
var j: integer;
begin
if nr > 1 then
begin
if Ring[nr - 1] = unten then
RingNachOben(nr - 1);
for j := nr - 2 downto 1 do
if Ring[j] = oben then
RingNachUnten(j)
end; { if nr > 1 then }
Ring[nr] := oben;
AnzahlBewegungen := AnzahlBewegungen + 1;
Print_AktuellenZustand;
end; { RingNachOben }
procedure RingNachUnten (nr: integer);
var j: integer;
begin
if nr > 1 then
begin
if Ring[nr - 1] = unten then
RingNachOben(nr - 1);
for j := nr - 2 downto 1 do
if Ring[j] = oben then
RingNachUnten(j)
end; { if nr > 1 then }
Ring[nr] := unten;
AnzahlBewegungen := AnzahlBewegungen + 1;
Print_AktuellenZustand;
end; { RingNachUnten }
procedure AlleRingeVonDerStangeEntfernen; { Algorithmus für den Lösungsprozess }
var i: integer;
begin
for i := 7 downto 1 do
RingNachUnten(i)
end; { AlleRingeVonDerStangeEntfernen }
procedure AnfangszustandHerstellen;
var i: integer;
begin
for i := 1 to 7 do
Ring[i] := oben;
end; { AnfangszustandHerstellen }
begin { Hauptprogramm }
AnfangszustandHerstellen;
AnzahlBewegungen := 0;
Print_AktuellenZustand;
AlleRingeVonDerStangeEntfernen; { Hier wird der Lösungs-Algorithmus aufgerufen }
end. { Hauptprogramm }
|
Zum Vexierproblem
Zur Lösung
(= Output des neben-stehenden Programms)
Zum Vexierproblem
Zur Lösung
(= Output des neben-stehenden Programms)
|