end;
Procedure Sort(j: Integer);
{Сортирует часть массива начинающуюся с j по возрастанию}
var i,k,Ind,Min{}: Integer;
begin
For i:=j to n do begin
Ind:=Towns[j];
Min:=32000;{}
For k:=i to n do
If Towns[k]<Min{Towns[Ind]{} Then begin
Ind:=k; Min:=Towns[k];{}
{Ch:=True;{}
end;
Exchange(Ind,i);
end;
end;
Procedure SetNextRote2;
var i: Integer;
begin
For i:=n downto 1 do begin
If Towns[i]>Towns[i-1] Then begin
Exchange(i-1,GetMinInd(i,i-1));
sort(i);
Exit;{Break;{}
end;
end;
end;
Function Fact(N: Integer): Real;
Begin
If n<>0 Then Fact:=n*Fact(n-1)
else Fact:=1;
end;
begin
ClrScr;
TextColor(14);
Summ:=0;
MinSumm:=2000000000;
ReadFromFile;
FillDist;
{InitTowns;{}
ToEstimate:=Fact(n-1);
WriteLn('Нaжмите Escape для отмены');
While Count<ToEstimate do begin
Summ:=0;
For i:=1 to n-1 do
Summ:=Summ+Dist[Towns[i],Towns[i+1]];
Summ:=Summ+Dist[Towns[n],Towns[1]];
If MinSumm>Summ Then begin
MinSumm:=Summ;
For k:=1 to n do
ResTour[k]:=Towns[k];
end;
SetNextRote2;
Inc(Count);
Prg:=(Count/ToEstimate*100);{}
Write('Кратчайший путь: ',MinSumm,' Просчитано: ',prg:3:1,
'%'{,ToEstimate:4);
For I:=1 to Round(prg*0.41) do Write(#219);{}
Write(#13);
If (KeyPressed) and (Readkey=#27) then halt;{}
end;
WriteLn(#7);
WriteLn('Получен кратчайший тур: ');
For k:=1 to n do
Write(ResTour{}[k],'-');
WriteLn(ResTour[1]);
WriteLn('Длина маршрута: ');
WriteLn(MinSumm);
Repeat Until KeyPressed;
end.
Размещено на Allbest.ru