Listing RADAR.PAS
Program Radar;
const maxn=1000;
type date=array[1..maxn] of
record
timp,li,co:Integer
end;
var i,n:Integer;
ses:date; {sesizeaza }
c:Char;
f,g:Text;
Function atinge_sol(i,j,k,tli,tco:Integer;
var btimp,bli,bco:Integer):Boolean;
Function se_apropie(li,co:Integer):Boolean;
begin
se_apropie:=(li>=496) and (li<=505)
and (co>=496) and (co<=505)
end;
Function afara(li,co:Integer):Boolean;
begin
afara:=(li<1) or (li>1000)
or (co<1) or (co>1000)
end;
begin
bli:=ses[i].li;
bco:=ses[i].co;
btimp:=ses[i].timp;
while not se_apropie(bli,bco)
and not afara(bli,bco) do
begin
btimp:=btimp+1;
bli:=bli+tli;
bco:=bco+tco
end;
atinge_sol:=se_apropie(bli,bco)
end;
Procedure alerteaza(i,j,k,tli,tco:Integer);
var ii,t,btimp,bli,bco:Integer;
begin
if atinge_sol(i,j,k,tli,tco,btimp,bli,bco)
then
begin
Write(g,ses[k].timp,' ',btimp);
Writeln(g,' ',bli,' ',bco)
end;
for ii:=i+1 to n do
begin
t:=ses[ii].timp-ses[i].timp;
if (t>=9) and
((ses[ii].li-ses[i].li) div t=tli) and
((ses[ii].co-ses[i].co) div t=tco)
then ses[ii].timp:=0
end
end;
Procedure prelucrare(i:Integer);
var j,k,tj,tk,tli,tco:Integer;
gata:Boolean;
begin
j:=i+1;
gata:=false;
while not gata and (j<=n) do
begin
tj:=ses[j].timp-ses[i].timp;
if tj>=9
then
begin
if (Abs(ses[j].li-ses[i].li) mod tj=0)
and
(Abs(ses[j].co-ses[i].co) mod tj=0)
then
begin
k:=j+1;
tli:=(ses[j].li-ses[i].li)div tj;
tco:=(ses[j].co-ses[i].co)div tj;
while not gata and (k<=n) do
begin
tk:=ses[k].timp-ses[j].timp;
if tk>=9
then
begin
if (Abs(ses[k].li-ses[j].li)
mod tk=0) and
(Abs(ses[k].co-ses[j].co)
mod tk=0) and
((ses[k].li-ses[j].li)
div tk=tli) and
((ses[k].co-ses[j].co)
div tk=tco)
then
begin
gata:=true;
alerteaza(i,j,k,tli,tco)
end
end;
k:=k+1;
end
end
end;
Inc(j)
end
end;
Begin
Assign(f,'RACHETA.IN');
Reset(f);
Assign(g,'RACHETA.OUT');
Rewrite(g);
i:=0;
while not Eof(f) do
begin
i:=i+1;
with ses[i] do Readln(f,timp,li,co)
end;
n:=i;
for i:=1 to n do
if ses[i].timp>0 then prelucrare(i);
Close(f); Close(g)
End.