![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Поиск путиDelphi , Синтаксис , Математика![]() unit road_; interface uses 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; 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(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); //ищем вторую точку маршрута // проверим, найден ли хотя бы один путь if not found then Labell.caption := 'Указанные точки не соединены!'; end; end. При запуске программы в момент активизации формы приложения происходит событие onActivate, процедура обработки которого заполняет массив StringGridl.cells значениями, представляющими описание карты. Этаже процедура нумерует строки и столбцы таблицы, заполняя зафиксированные ячейки первого столбца и первой строки StringGridl. Поиск маршрута инициирует процедура TFormi.Buttoniciick, которая запускается щелчком на кнопке Поиск. Данная процедура для поиска точки, соединенной с исходной точкой, вызывает процедуру step, которая после выбора первой точки, соединенной с начальной, и включения ее в маршрут вызывает сама себя. При этом в качестве начальной точки задается уже не исходная, а текущая, только что включенная в маршрут. Here's a translation of the text into Russian: Это программное обеспечение на Delphi, которое симулирует алгоритм поиска в графе для поиска кратчайшего пути между двумя узлами на карте-лоскутке. Программа использует компонент StringGrid для представления карты и компонент Edit для ввода начального и конечного узлов. Вот разбивка кода:
Процедура Программа использует булевый массив Вот некоторые предложения по улучшению кода:
Вот обновленная версия кода с некоторыми улучшениями:
Обратите внимание, что я добавил некоторые комментарии для объяснения того, что делает каждый участок кода, и также рефакторировал некоторые части кода для лучшей читаемости. В статье описывается программный код на Delphi, который реализует поиск пути между двумя точками на карте. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Математика ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |