Cod sursa(job #547909)

Utilizator YTE.DLexum Delus YTE.D Data 6 martie 2011 20:09:55
Problema Rj Scor 50
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.54 kb
program romeosijulieta;

const dx:array[1..8] of shortint=(0,1, 0,-1,-1,1,-1, 1);
      dy:array[1..8] of shortint=(1,0,-1, 0,-1,1, 1,-1);

type punct=record
      x,y:shortint;
      end;

var n,m:byte;
    f:text;
    o:array[1..101,1..101] of integer;
    rr,jj,i:punct;

procedure citire;
var i,j:byte;
    c:char;
begin
assign(f,'rj.in');reset(f);
readln(f,n,m);

for i:=1 to n do
 begin
 for j:=1 to m do
  begin
  read(f,c);
  case c of
   'X':o[i,j]:=0;
   'R':begin
       rr.x:=i;
       rr.y:=j;
       o[i,j]:=1;
       end;
   'J':begin
       jj.x:=i;
       jj.y:=j;
       o[i,j]:=-1;
       end;
   ' ':o[i,j]:=n*m+1;
   end;
  end;
 readln(f);
 end;
close(f);
end;

procedure afisare;
begin
assign(f,'rj.out');rewrite(f);
writeln(f,abs(o[i.x,i.y]),' ',i.x,' ',i.y);
close(f);
end;

procedure lee;
var c:array[1..10201] of punct;
    p,u:word;
    x,y:shortint;
    dir:shortint;
    e:punct;
begin
c[1]:=rr;
c[2]:=jj;
p:=1; u:=2;

while p<=u do
 begin
 e:=c[p];
 for dir:=1 to 8 do
  begin
  x:=e.x+dx[dir];
  y:=e.y+dy[dir];
  if (x>0)and(x<=n)and(y>0)and(y<=m)and(o[x,y]<>0) then
   if abs(o[x,y])>abs(o[e.x,e.y])+1 then
    begin
    if o[e.x,e.y]>0 then o[x,y]:=o[e.x,e.y]+1
                    else o[x,y]:=o[e.x,e.y]-1;
    inc(u);
    c[u].x:=x;
    c[u].y:=y;
    end
   else
   if (abs(o[x,y])=abs(o[e.x,e.y])+1)and(o[e.x,e.y]*o[x,y]<0)then
    begin
    i.x:=x;
    i.y:=y;
    p:=u+1;
    end;
  end;
 inc(p);
 end;
end;

begin
citire;
lee;
afisare;
end.