Задача про транспортную систему. Подбор вариантов проезда с учетом кол-ва пересадок, длительности, видов транспорта (самолет, авто, поезд, водн.) — страница 5

  • Просмотров 4904
  • Скачиваний 361
  • Размер файла 38
    Кб

{Переход к следующему рейсу в маршруте} inc(r); Until P=nil; if s1<=cost then begin {Если соответствует цена} P:=A; Repeat new(Q); {Сборка цепочки рейсов маршрута} Q^:=P^; Q^.last:=Panswer^.path; Panswer^.path:=Q; P:=P^.last; {Переход к следующему рейсу в маршруте} Until p=nil; Panswer^.mincost:=s1; Panswer^.maxcost:=s2; {Сохранение сумарных цен и времени} Panswer^.waytime:=d; Panswer^.reboard:=r; {и числа пересадок в элементе маршрута} W:=LAnswer; While (W^.next<>nil) and ((W^.next)^.waytime<d) do W:=W^.next; {Поиск места в соответствии времени пути} While

(W^.next<>nil) and ((W^.next)^.reboard<r) and ((W^.next)^.waytime=d) do W:=W^.next; {Поиск места по кол-ву пересадок} Panswer^.next:=W^.next; {Добавление маршрута в найденное место} W^.next:=Panswer; end end; {Возвращает ссылку на информацию об I-ой станции следования} Function CityInPath(A:Pway; I:citycode):WayP; var P:Pway; Begin P:=A; While I>4 do begin I:=I-4; P:=P^.next end; {Поиск четверки в которой данная станция} CityInPath:=@P^.Way[I]; {Результат} end; const ReBoadingDelay=120; {Минимальное время пересадки} {Возвращает время до следещего после

указанного времени time отоправление от станции} {номер N рейса A} Function DepartureDelay(A:PFlight; N:CityCode; time:week ):word; var S:word; I:1..4; P:PWay; Q:DayTable; begin P:=A^.path; S:=0; While N>4 do begin N:=N-4; For I:=1 to 4 do S:=S+P^.Way[I].delay+P^.Way[I].reboard; {подсчет времени пути по полным четверкам} P:=P^.next; end; For I:=1 to N do S:=S+P^.Way[I].delay+P^.Way[I].reboard; {Подсчет по неполной четверке} time:=(10080+time-(S mod 10080)) mod 10080; {Время отправления этого рейса от начальной станции} Q:=A^.Table; while (Q<>nil) and (Q^.time<time+ReboadingDelay) do Q:=Q^.next; {Поиск

ближайшего времени на текущей неделе} If Q<>nil then Departuredelay:=Q^.time-time else {Если на текущей неделе не найден} DepartureDelay:=10080-time+(A^.Table)^.time; {Поиск ближайщего времени на следующей неделе} end; {Поиск всех возможных маршрутов, удовлетворяющих Pattern} Procedure Search (FlightList:Pflight; const Pattern:Blank; Path:Link); Var P:Pflight; I,J:CityCode; D,DDelay:Word; K:WayClass; B1,B2:Boolean; NPattern:Blank; NPath:Link; c:Longint; {Проверка допустимости маршрута (проверка дублирования города)} Function Posible (P:Link; L:CityCode):Boolean; Var b:boolean;

i:citycode; Q:pway; Begin b:=true; While (P<>nil) and b do begin {Просмотр всех предидущих пересадок} Q:=P^.flight^.path; i:=1; while Q^.way[i].city<>P^.bcity do begin {Поиск города отправления} i:=(i mod 4)+1; if i=1 then Q:=Q^.next; end; repeat b:=Q^.way[i].city<>L; {Проверка города на дублирование} i:=(i mod 4)+1; if i=1 then Q:=Q^.next until (Q^.way[i].city=P^.target) or not b; {переход к следующему пока не город назначения} p:=p^.last end; Posible:=b; End; begin New(NPath); NPath^.last:=Path; P:=FlightList; While P<>nil do begin {Просмотр всех рейсов} if ((Path=nil) or (P<>Path^.Flight)) and

Pattern.Kind[P^.Kind] then {не повторяется рейс и сответствует тип перевозки} begin I:=1; {Поиск среди городов следования начальный пункт} While (I<P^.TotalStation-1) and (CityInPath(P^.path, I)^.city<>Pattern.BCity) do inc (I); If CityInPath(P^.path, I)^.city=Pattern.BCity then begin {Если начальный найден} NPattern:=Pattern; {Подготовка нового шаблона и новой пересадки} if Npattern.reboading>1 then dec(Npattern.reboading); Npath^.flight:=P; For K:=1 to Mclass do Npath^.cost[k]:=0; Npath^.bcity:=pattern.bcity; Npath^.Ddelay:=DepartureDelay(P,I,Pattern.delay); Npath^.waytime:=0; J:=I; Repeat {просмотр следующих