program p_perm;           (* alle Permutationen testen, Thomas Klein  1999 *)
{$M 65520,0,655360}                         (* max. Stackgroesse *)
uses graph,tsp;

procedure permutation(var w:weg);
 (* alle Permutationen testen *)
 var min,l:entfernung;
     t:weg;
 procedure perm(i:stadtnr);
  var j:stadtnr;
  begin
   if i<>0 then t:=t+chr(i);
   if length(t)<stadtanzahl then begin
    for j:=1 to stadtanzahl do
     if pos(chr(j),t)=0 then perm(j);
   end else begin
    l:=weglaenge(t+t[1]);
    if l<min then begin w:=t+t[1]; min:=l; end;
   end;
   delete(t,length(t),1);                   (* letzte Stadt entfernen *)
  end;
 begin
  min:=maxentfernung; t:='';
  perm(0);
 end;

begin
 if tspinit('TSP: Permutationen','Berechnen') then
  while tspmenue([0..255]) do begin
   start; permutation(aktuell); stop;
   wegkarte(aktuell,true,brown,yellow);
   laenge_aus(aktuell); zeit_aus(true);
  end;
 closegraph;
end.
