Informatika gyűjtemény

Egy szinttel feljebb pt_indiana.pas

2004050607080910

NézetNyomtat

pt_indiana.pas (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 3 KB
program indiana;

type  TFal  = record
                X1,Y1:longint;
                X2,Y2:longint;
                L:longint;
                F,V:boolean;
              end;
var   t:array of TFal;
      D:array of longint;
      tav:array of array of longint;
      N:longint;

function pita(x1,y1,x2,y2:longint):longint;
begin
  pita := (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
end;

function D2(ai,bi:longint):longint;
var a,b:TFal;
begin
  a:=t[ai];
  b:=t[bi];
  
  if ((a.V) and (b.V)) then
    begin
      if a.X2 < b.X1 then D2:=pita(a.X2,a.Y2,b.X1,b.Y1) else
      if b.X2 < a.X1 then D2:=pita(b.X2,b.Y2,a.X1,a.Y1) else
                          D2:=sqr(abs(a.y1-b.y1));
    end else
  if ((a.F) and (b.F)) then
    begin
      if a.Y2 < b.Y1 then D2:=pita(a.X2,a.Y2,b.X1,b.Y1) else
      if b.Y2 < a.Y1 then D2:=pita(b.X2,b.Y2,a.X1,a.Y1) else
                          D2:=sqr(abs(a.x1-b.x1));
    end else
  if ((a.V) and (b.F)) then
    begin
      if b.X1<a.X1 then
        begin
          if a.Y1<b.y1 then D2:=pita(a.x1,a.y1,b.x1,b.y1) else
          if b.Y2<a.y1 then D2:=pita(a.x1,a.y1,b.x2,b.y2) else
                            D2:=sqr(abs(a.x1-b.x1));
        end else
      if a.X2<b.X1 then
        begin
          if a.Y2<b.y1 then D2:=pita(a.x2,a.y2,b.x1,b.y1) else
          if b.Y2<a.y2 then D2:=pita(a.x2,a.y2,b.x2,b.y2) else
                            D2:=sqr(abs(a.x2-b.x1));
        end
      else
        begin
          if a.y1<b.y1 then D2:=sqr(abs(a.y1-b.y1)) else
          if a.y1>b.y2 then D2:=sqr(abs(a.y1-b.y2)) else
                            D2:=0;
        end;
    end;
  if ((a.F) and (b.V)) then
    begin
      if a.X1<b.X1 then
        begin
          if b.Y1<a.y1 then D2:=pita(b.x1,b.y1,a.x1,a.y1) else
          if a.Y2<b.y1 then D2:=pita(b.x1,b.y1,a.x2,a.y2) else
                            D2:=sqr(abs(b.x1-a.x1));
        end else
      if b.X2<a.X1 then
        begin
          if b.Y2<a.y1 then D2:=pita(b.x2,b.y2,a.x1,a.y1) else
          if a.Y2<b.y2 then D2:=pita(b.x2,b.y2,a.x2,a.y2) else
                            D2:=sqr(abs(b.x2-a.x1));
        end
      else
        begin
          if b.y1<a.y1 then D2:=sqr(abs(b.y1-a.y1)) else
          if b.y1>a.y2 then D2:=sqr(abs(b.y1-a.y2)) else
                            D2:=0;
        end;
    end;
end;

function load:boolean;
var i,j:longint;
    X0,Y0,L0:longint;
begin
  readln(N);
  load:=true;
  if N>0 then
    begin
      setlength(t,N+1);
      setlength(D,N+1);
      setlength(tav,N+1,N+1);
      for i:=1 to N do
        begin
          readln(X0,Y0,L0);
          with(t[i])do
            begin
              X1 :=  X0;
              Y1 :=  Y0;
              L  :=  abs(L0);
              V  := (L0>0);
              F  := not(V);
              
              X2:=X1;
              Y2:=Y1;
              
              if V  then X2:=X2+L
                    else Y2:=Y2+L;
            end;
          D[i]:=maxlongint;          
        end;
      
      for i:=1 to N do 
        for j:=1 to N do
          tav[i][j]:=D2(i,j);
    end
  else
    begin
      load:=false;
    end;
end;

function maxof(x,y:longint):longint;
begin
  if x>then maxof:=else maxof:=y;
end;

procedure dijkstra;
var vege:boolean;
  i,j:longint;
  uj:longint;
begin
  repeat
    vege:=true;
    for i:=1 to N do
      for j:=1 to N do
        if i<>then
          begin
            uj:=maxof(D[i],tav[i][j]);
            if uj < D[j] then
              begin
                D[j]:=uj;
                vege:=false;
              end;
          end;
          
  until vege;
end;

procedure dump;
var i,j:longint;
begin
  for i:=1 to N do
    writeln(i:2,'(',t[i].x1,',',t[i].y1,')-(',t[i].x2,',',t[i].y2,') = [',t[i].L,',',t[i].V,']');
  
  writeln;
    
  for i:=1 to N-1 do
    for j:=i+1 to N do
      begin
        writeln('D2( ',i:2,',',j:2,' ) = ',D2(i,j));
      end;
end;

begin
  while(load)do  
    begin
      D[1]:=0;
      dijkstra;
      writeln(sqrt(D[2]):0:2);
    end;
end.
(Vissza)