Поиск пути
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; begin if s=f then begin // Точки s и f совпали! found: = TRUE; Labell.caption: = Labell.caption+#13+'Путь:'; for i: = l to p-1 do Labell.caption: = Labell.caption+' ' +IntToStr(road[i]); end else begin // выбираем очередную точку for c: = l to N do begin // проверяем все вершины if (map[s,c]<> 0) and (NOT incite1) // точка соединена с текущей и не включена в маршрут then begin road[p]: = c;// добавим вершину в путь incl[c]: = TRUE;// пометим вершину как включенную step(c,f,p+l); incite]: = FALSE; road[p]: = 0; end; end; end; end; // конец процедуры step begin Label1.caption: =' '; // инициализация массивов for i: = l to N do road[i]: = 0; for i: = l to N do incl[i]: = FALSE; // ввод описания карты из SrtingGrid.Cells for i: = l to N do for j: = 1 to N do if StringGrid1.Cells[i,j] <> '' then map[i,j]: = StrToInt(StringGrid1.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);//ищем вторую точку маршрута // проверим, найден ли хотя бы один путь if not found then Labell.caption: = 'Указанные точки не соединены!'; end; end.
При запуске программы в момент активизации формы приложения происходит событие onActivate, процедура обработки которого заполняет массив StringGrid1.cells значениями, представляющими описание карты. Этаже процедура нумерует строки и столбцы таблицы, заполняя зафиксированные ячейки первого столбца и первой строки StringGrid1.
Поиск маршрута инициирует процедура TFormi.Buttoniciick, которая запускается щелчком на кнопке Поиск. Данная процедура для поиска точки, соединенной с исходной точкой, вызывает процедуру step, которая после выбора первой точки, соединенной с начальной, и включения ее в маршрут вызывает сама себя. При этом в качестве начальной точки задается уже не исходная, а текущая, только что включенная в маршрут.