%Pascal/MATLAB-Kurs WS 2001, Gerhard Opfer
%Turm von Hanoi, rekursive Prozedur
%nach einem Pascal-Programm von Elsbeth Bredendiek (ca. 1990).
%Diese Pascal-Prozedur hatte nur die folgenden 9 Zeilen:
%
%  procedure hanoi(n:integer;A,B,C:char);
%  begin
%    if n>0 then
%    begin
%      hanoi(n-1,A,C,B);
%      writeln('Stein ',n:3,' von Turm ',A,' nach Turm ', C);
%      hanoi(n-1,B,A,C);
%    end; {if n} 
%  end; {hanoi}
%
%Es geht darum, einen Turm in Position 1, der von oben nach unten n "Steine"
%verschiedener, wachsender Groesse 1,2,...,n enthaelt, unter zuhilfenahme eines
%Turms in Position 2 auf einen Turm in Position 3 so umzuschichten, dass auf 
%dem Turm in Position 3 dieselbe Anordnung entsteht wie am Anfang auf dem 
%Turm in Position 1 unter Benutzung der folgenden Regeln: 
%(a) Es wird jeweils nur ein Stein, naemlich der oberste eines Turms bewegt, 
%(b) niemals liegt ein groesserer Stein auf einem kleineren Stein.
%
%Der Inhalt der drei Tuerme wird in jedem Zwischenschritt in den drei 
%Vektoren Turm1,Turm2,Turm3 gespeichert. Diese Information
%wird zum Zeichnen der Tuerme benutzt.
%Diese Prozedur wird mit dem Programm "turmcall" aufgerufen. Zur 
%Verfuegung stehen muss auch das Programm "turmzeichnen".
%function []=Hanoi(n,Pos1,Pos2,Pos3);

%Diese Datei ist vor Benutzung umzubenennen in Hanoi.m

function []=Hanoi(n,Pos1,Pos2,Pos3);
global Turm1; global Turm2; global Turm3; global z; global mfix;
global Farbe1; global Farbe2; global Farbe3;
if n>0
Hanoi(n-1,Pos1,Pos3,Pos2);
  disp(['Verlagerung von Stein ',int2str(n),' von Pos ',...
  int2str(Pos1),' auf Pos ',int2str(Pos3)]);
  s1=['j1=find(Turm',int2str(Pos1),'==n);Turm',int2str(Pos1),'(j1)=[];'];
  s2=['Turm',int2str(Pos3),'=[Turm',int2str(Pos3),',n];'];
  eval(s1);   eval(s2);   z=z+1;
  if mfix==1
    subplot(1,2,z); else
    subplot(2^(mfix-2),4,z);
  end;
  turmzeichnen(mfix,Turm1,Turm2,Turm3,Farbe1,Farbe2,Farbe3);
  Hanoi(n-1,Pos2,Pos1,Pos3);   %Es werden insgesamt 2^n-1 Schritte benoetigt.
end; %if n>0

%Ergebnis aus den Pascal-Programm
%(dieses MATLAB-Programm liefert dasselbe)
%Wie hoch soll der Turm sein? 4
%Scheibe  1 von 1 nach 2
%Scheibe  2 von 1 nach 3
%Scheibe  1 von 2 nach 3
%Scheibe  3 von 1 nach 2
%Scheibe  1 von 3 nach 1
%Scheibe  2 von 3 nach 2
%Scheibe  1 von 1 nach 2
%Scheibe  4 von 1 nach 3
%Scheibe  1 von 2 nach 3
%Scheibe  2 von 2 nach 1
%Scheibe  1 von 3 nach 1
%Scheibe  3 von 2 nach 3
%Scheibe  1 von 1 nach 2
%Scheibe  2 von 1 nach 3
%Scheibe  1 von 2 nach 3  %in 2^n-1=15 Schritten
