unit road_;
interfaceuses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForml = class(TForm)
StringGridl: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
procedure FormActivate(Sender: TObject);
procedure ButtonlClickfSender: TObject);
private{ Private declarations }public{ Public declarations }end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForml.FormActivate(Sender: TObject);
var
i: integer;
begin// нумерация строкfor i := 1 to 10 do
StringGridl.Cells[0, i] := IntToStr(i); // нумерация колонокfor i := l to 10 do
StringGridl.Cells[1, 0] := IntToStr(i);
// описание предопределенной карты
StringGridl.Cells[1,2]:="1"
StringGridl.Cells[2,l]:="1"
StringGridl.Cells[1, 3] := "1"
StringGridl.Cells[3, 1] := "1"
StringGridl.Cells[1, 4] := "1"
StringGridl.Cells[4, 1] := "1"
StringGridl.Cells[3, 7] := "1"
StringGridl.Cells[7, 3] := "1"
StringGridl.Cells[4, 6] := "1"
StringGridl.Cells[6, 4] := "1"
StringGridl.Cells[5, 6] := "1"
StringGridl.Cells[6, 5] := "1"
StringGridl.Cells[5, 7] := "1"
StringGridl.Cells[7, 5] := "1"
StringGridl.Cells[6, 7] := "1"
StringGridl.Cells[7, 6] := "1"
end;
procedure TForml.ButtonlClick(Sender: TObject);
const
N = 10; // кол-во вершин графа var
map: array[1..N, 1..N] of integer; // Карта.map[i,j]ne 0,// если точки i и j соединены
road: array[1..N] of integer;
// Дорога - номера точек карты
incl: array[1..N] of boolean; // incl[1]равен TRUE, если точка// с номером i включена в road
start, finish: integer; // Начальная и конечная точки
found: boolean; i, j: integer;
procedure step(s, f, p: integer);
var
с: integer; // Номер точки, в которую делаем очередной шаг
i: integer;
beginif s = f thenbegin// Точки s и f совпали !
found := TRUE;
Labell.caption := Labell.caption + #13 + "Путь:";
for i := l to p - 1 do
Labell.caption := Labell.caption + " "
+ IntToStr(road[i]);
endelsebegin// выбираем очередную точкуfor c:=l to N dobegin// проверяем все вершины// точка соединена с текущей и не включена в маршрутif (map[s, c] <> 0) and (not incite1) thenbegin
road[p] := c; // добавим вершину в путь
incl[c] := TRUE; // пометим вершину как включенную
step(c, f, p + l); incite] := FALSE;
road[p] := 0;
end;
end;
end;
end; // конец процедуры stepbegin
Label1.caption: = " ";
// инициализация массивовfor i := l to N do
road[i] := 0;
for i := l to N do
incl[i] := FALSE;
// ввод описания карты из SrtingGrid.Cellsfor i := l to N dofor j := 1 to N doif StringGrid1.Cells[i, j] <> "" then
map[i, j] := StrToInt(StringGridl.Cells[i, j];
else
map[i, j] := 0;
start := StrToInt(Editl.text);
finish := StrToInt(Edit2.text);
road[l] := start; // внесем точку в маршрут
incl[start] := TRUE; // пометим ее как включенную
step(start, finish, 2); //ищем вторую точку маршрута// проверим, найден ли хотя бы один путьifnot found then
Labell.caption := "Указанные точки не соединены!";
end;
end.
При запуске программы в момент активизации формы приложения происходит событие onActivate, процедура обработки которого заполняет массив StringGridl.cells значениями, представляющими описание карты. Этаже процедура нумерует строки и столбцы таблицы, заполняя зафиксированные ячейки первого столбца и первой строки StringGridl.
Поиск маршрута инициирует процедура TFormi.Buttoniciick, которая запускается щелчком на кнопке Поиск. Данная процедура для поиска точки, соединенной с исходной точкой, вызывает процедуру step, которая после выбора первой точки, соединенной с начальной, и включения ее в маршрут вызывает сама себя. При этом в качестве начальной точки задается уже не исходная, а текущая, только что включенная в маршрут.
Если Вас заинтересовала или понравилась информация по разработке на Delph - "Поиск пути", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу: Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!