unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ComCtrls;
type
TfmMain = class(TForm)
Grid: TStringGrid;
PathList: TListView;
GoButt: TButton;
edNumNodes: TEdit;
Label1: TLabel;
Complete: TButton;
Clear: TButton;
Check: TButton;
procedure GoButtClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure CalcCost(Current : string; Next : char; Rest : string;
Cost : Integer);
procedure CheckBest(Path : string; Cost : integer);
procedure AddPath(Path : string; Cost : integer);
public
{ Public declarations }
end;
var
fmMain: TfmMain;
implementation
{$R *.dfm}
var
best : integer;
procedure TfmMain.GoButtClick(Sender: TObject);
var
Range : string;
i : integer;
begin
Best := 0;
Range := '';
for i := 2 to StrToInt(edNumNodes.text) do
Range := Range + IntToStr(i);
CalcCost('','1',range,0);
end;
procedure TfmMain.CalcCost(Current: string; Next: char; Rest: string;
Cost: Integer);
var
TmpRest : string;
i, len : integer;
TmpNext, Last : char;
begin
Len := Length(Current);
If len <> 0 then begin
Last := Current[len];
Cost := Cost + StrToInt(Grid.Cells[StrToInt(Last),StrToInt(Next)]);
end;
Current := Current + Next;
If Length(rest) < 1 then begin
CheckBest(Current,Cost);
exit;
end;
for i := 1 to Length(rest) do begin
TmpNext := Rest[i];
TmpRest := Rest;
Delete(TmpRest,i,1);
CalcCost(Current, TmpNext, TmpRest, Cost);
end;
end;
procedure TfmMain.FormCreate(Sender: TObject);
var
i : integer;
begin
best := 0;
for i := 1 to 7 do begin
Grid.Cells[i,0] := IntToStr(i);
Grid.Cells[0,i] := IntToStr(i);
Grid.Cells[i,i] := '-';
end;
end;
procedure TfmMain.CheckBest(Path: string; Cost: integer);
var
First, Last : char;
begin
First := Path[1];
Last := Path[Length(Path)];
Cost := Cost + StrToInt(Grid.Cells[StrToInt(first),StrToInt(last)]);
if Best = 0 then begin
PathList.Clear;
AddPath(Path, Cost);
end
else if Cost < Best then begin
PathList.Clear;
AddPath(Path, Cost);
end
else if Cost = Best then begin
AddPath(Path, Cost);
end;
end;
procedure TfmMain.AddPath(Path: string; Cost: integer);
var
Item : TListItem;
begin
Best := cost;
Item := PathList.Items.Add;
Item.Caption := Path;
Item.SubItems.Add(IntToStr(cost));
end;
end.