Cod sursa(job #108657)

Utilizator al3csutzuSirbu Alexandru al3csutzu Data 23 noiembrie 2007 15:10:02
Problema Rj Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.92 kb
program rj;
var f,g:text;
a:array[1..100] of string;
sol1,sol2:array [0..100,0..100] of integer;
s1x,s2x,s1y,s2y:array [1..10000] of integer;
dx,dy:array[1..8] of integer;
n,m,i,j,st,fn,nr:integer;
vida:boolean;
begin
  assign(f,'rj.in'); assign(g,'rj.out');
  reset(f); rewrite(g);
  readln(f,n,m);
  for i:=1 to n do
  begin
    readln(f,a[i]);
    for j:=1 to m do
    if a[i,j]='R' then begin s1x[1]:=i; s1y[1]:=j; end else
    if a[i,j]='J' then begin s2x[1]:=i; s2y[1]:=j; end
  end;
  dx[1]:=-1; dy[1]:=-1; dx[2]:=-1; dy[2]:=0; dx[3]:=-1; dy[3]:=1;
  dx[4]:=0; dy[4]:=-1; dx[5]:=0; dy[5]:=1;
  dx[6]:=1; dy[6]:=-1; dx[7]:=1; dy[7]:=0; dx[8]:=1; dy[8]:=1;
  st:=1;
  fn:=1;
  vida:=false;
  sol1[s1x[st],s1y[st]]:=1;
  nr:=0;
  while not vida do
  begin
    for i:=1 to 8 do
      if (s1x[st]+dx[i]>0) and (s1y[st]+dy[i]>0) and (s1x[st]+dx[i]<n+1) and (s1y[st]+dy[i]<m+1) and
        (a[s1x[st]+dx[i],s1y[st]+dy[i]]<>'X') and (sol1[s1x[st]+dx[i],s1y[st]+dy[i]]=0) then
      begin
        sol1[s1x[st]+dx[i],s1y[st]+dy[i]]:=sol1[s1x[st],s1y[st]]+1;
        fn:=fn+1;
        s1x[fn]:=s1x[st]+dx[i];
        s1y[fn]:=s1y[st]+dy[i];
      end;
    st:=st+1;
    if fn<st then vida:=true;
  end;
  st:=1;
  fn:=1;
  vida:=false;
  sol2[s2x[st],s2y[st]]:=1;
  nr:=0;
  while not vida do
  begin
    for i:=1 to 8 do
      if (s2x[st]+dx[i]>0) and (s2y[st]+dy[i]>0) and (s2x[st]+dx[i]<n+1) and (s2y[st]+dy[i]<m+1) and
      (a[s2x[st]+dx[i],s2y[st]+dy[i]]<>'X') and (sol2[s2x[st]+dx[i],s2y[st]+dy[i]]=0) then
      begin
        sol2[s2x[st]+dx[i],s2y[st]+dy[i]]:=sol2[s2x[st],s2y[st]]+1;
        fn:=fn+1;
        s2x[fn]:=s2x[st]+dx[i];
        s2y[fn]:=s2y[st]+dy[i];
      end;
    st:=st+1;
    if fn<st then vida:=true;
  end;
  for i:=1 to n do
  for j:=1 to m do
  if (sol1[i,j]=sol2[i,j]) and (sol1[i,j]<>0) then begin writeln(g,sol1[i,j],' ',i,' ',j); break; end;
  close(f); close(g);
end.