Нахождение пути от одного населённого пункта к другому
Рефераты >> Программирование и компьютеры >> Нахождение пути от одного населённого пункта к другому

procedure findnext(a:vec;tv:integer;nv:integer;lv:integer);

var

i:integer; {Счетчик}

begin

a[tv]:=lv; {Устанавливается в векторе

флаг, что город tv пройден}

if (tv=nv) then begin

{Если достигнут необходимый город}

if ((lv+1)<nfv)or(nfv=0) then begin

{Если найден первый либо более короткий маршрут - он становится найденным}

nfv:=lv+1;

fv:=a;

end;

end else begin

{Иначе - просмотр всех городов, в которые можно добраться из данного}

for i:=1 to nr do

{Если город еще не учитывался - запуск для него той же самой функции}

if ((r[i].a=tv)and(a[r[i].b]=0)) then findnext(a,r[i].b,nv,lv+1);

{Просмотр, но для дорог, где текущий город учитывался как второй}

for i:=1 to nr do

{Если город еще не учитывался - запуск для него той же самой функции}

if ((r[i].b=tv)and(a[r[i].a]=0)) then findnext(a,r[i].a,nv,lv+1);

end;

end;

{Нахождениепути}

procedure FindPath;

var

i:integer; {Счетчик}

j:integer; {Счетчик}

n:integer; {Исходный город}

sl:integer; {Выбираемый город}

c:char; {Считанный с клавиатуры символ}

v:vec; {Вектор для начала рекурсии}

begin

{Изначально первый город не выбран}

n:=0;

sl:=1;

nfv:=0; {Маршрут не найден}

{Цикл запроса городов и вывода результатов}

repeat

textattr:=7;

clrscr;

{Вывод поясняющей надписи}

gotoxy(2,20);

if (n=0) then write(' Выберите начальный пункт')

else writeln(' Выберите конечный пункт ');

{Вывод списка городов}

for i:=1 to nt do begin

gotoxy (25,i+3);

write (t[i]);

end;

textattr:= 77;

gotoxy (25,sl+3);

write (t[sl]);

if (n<>0) then begin

textattr:=66;

gotoxy (25,n+3);

write (t[n]); {Вывод отмеченного города}

end;

textattr:=7;

{Вывод найденного маршрута либо надписи о его отсутствии}

gotoxy(60,1);

if (nfv>0) then begin

write(' Найденный маршрут: ');

for j:=1 to nfv do

for i:=1 to nt do if fv[i]=j then begin

gotoxy(60,j+2);

write(t[i]);

end;

end else write(' Маршрут не найден ');

c:=readkey; {Ввод символа с клавиатуры}

case c of

#13: begin

{Либо фиксируется начальный город}

if n=0 then n:=sl else begin

{Либо убирается ошибочно выбранный город}

if (n=sl) then n:=0 else begin

{Либо происходит поиск нового маршрута}

nfv:=0; {Маршрута нет}

for i:=1 to 20 do v[i]:=0; {Ни одного пройденного

города}

findnext(v,n,sl,1);{Вызывается первый раз рекурсивная

процедура}

end;

n:=0;

sl:=1;

end;

end;

#0: begin {Анализ функциональных клавиш}

c:=readkey;

case c of

#80: if sl<nt then sl:=sl+1 else sl:=1;

#72: if sl>1 then sl:=sl-1 else sl:=nt;

end

end

end;

until (c=#27);

end;

end.

Результаты выполнения программы.

¦ Ввод данных ¦

¦ Вывод данных ¦

¦ Запись в файл ¦

¦ Считывание файла ¦

¦ Вывод результата ¦

+------ Выход ------+

Ввод данных:

Введите название города (Пустая строка - закончить):

>Город 1

>Город 2

>Город 3

>Город 4

>Город 5

>

Дороги: {1,3} {3,4} {2,5} {1,4} {2,4} {2,3}

Вывод результата:

Найденный маршрут: Город 1 Город 1

Город 3 Город 2

Город 2 Город 3

Город 5 Город 4

Город 5

Список используемых источников

1. Белецкий Я. Турбо Паскаль с графикой для персональных компьютеров /перевод с польского Д. И. Юренкова. - М. :Машиностроение, 1991.

2. Сергиевский М. В., Шалашов А. В. Турбо Паскаль 7.0; язык, среда программирования. - М: Машиностроение, 1994.

3. Справочник по процедурам и функциям Borland Pascal With Objects 7.0. - Киев: Диалектика, 1993.


Страница: