Cod sursa(job #593419)

Utilizator vendettaSalajan Razvan vendetta Data 2 iunie 2011 17:39:47
Problema Rj Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.26 kb
type d = record
        x, y : longint;
end;
const f = 'rj.in'; g = 'rj.out';
const
    dx : array[0..7] of shortint = (-1,1,0,0,1,1,-1,-1);
    dy : array[0..7] of shortint = (0,0,-1,1,1,-1,1,-1);
type vec = array[-4..101,-4..101] of longint;
var
    ch : char;
    nrp, min, ma,mb,mxa,mxb,i, j, x, y, n, m, p : longint;
    a,b : vec;
    drum : array[0..100001] of d;
    sol,ince, sf : d;


function check ( x,y : longint ) : boolean;
    begin
        if ( x>0) and( x<=n) and ( y>0) and (y<=m) then check := true
            else check := false;
    end;
procedure lee;
    var
        k, st, dr, ii ,jj : longint;
    begin
    st := 0;
    dr := 1;
    drum[st]:= ince;
    //drum[st].x := 1;
    //drum[st].y := 1;
    //a[1,1]:=0;
    //a[1,1] := 1;
    while (st <= dr) do
        begin
        for k := 0 to 7  do
            begin
            ii := drum[st].x + dx[k];
            jj := drum[st].y + dy[k];
            if check(ii,jj) and ( a[ii,jj] = 0 ) then
                begin
                drum[dr].x := ii;
                drum[dr].y := jj;
                a[ii,jj] := a[drum[st].x,drum[st].y]+1;
                inc ( dr );
                end;
            end;
        inc( st );
        end;
    end;

procedure lee2;
    var
        k, st, dr, ii ,jj : longint;
    begin
    st := 0;
    dr := 1;
    drum[st] := sf;
    //drum[st].x := n;
    //drum[st].y := m;
    //b[1,1]:=0;
    //b[n,m] := 1;
    while (st <= dr) do
        begin
        for k := 0 to 7  do
            begin
            ii := drum[st].x + dx[k];
            jj := drum[st].y + dy[k];
            if check(ii,jj) and ( b[ii,jj] = 0 ) then
                begin
                drum[dr].x := ii;
                drum[dr].y := jj;
                b[ii,jj] := b[drum[st].x,drum[st].y]+1;
                inc ( dr );
                end;
            end;
        inc( st );
        end;
    end;
begin
    assign( input,f ); reset( input );
    assign( output,g ); rewrite( output );
    readln(n, m);
    for i := 1 to n do
        begin
        for j := 1 to m do
            begin
            read( ch );
            if ch = 'X' then begin a[i,j] := -1; b[i,j] := -1; end;
            if ch = 'R' then begin a[i,j] := 0; ince.x := i; ince.y := j; end;
            if ch = 'J' then begin b[i,j] := 0; sf.x := i; sf.y := j; end;
            if ch = ' ' then begin a[i,j] := 0; b[i,j] := 0; end;
            end;
        readln;
    end;
    lee();
    {
    for i := 1 to n do begin
        for j := 1 to m do  write(a[i,j]:3);
        writeln;
    end;
    writeln;
     }
    lee2();
    {
    for i := 1 to n do begin
        for j := 1 to m do begin write(b[i,j]:3);
        if mb>b[i,j] then mb:=b[i,j];
        if mxb<b[i,j] then mxb:=b[i,j];end;
        writeln;
    end;
    writeln('min a ',ma,' ','max a ',mxa);
    writeln('min b ',mb,' ','max b ',mxb);
    }
    min := 99999999;
    //min := maxlongint;
    for i := 1 to n do
        for j := 1 to m do begin
            if (a[i,j]=b[i,j]) and (a[i,j]>0) and (a[i,j]<min) then begin
                min := a[i,j];
                sol.x := i;
                sol.y := j;
                end;
        end;
    writeln( min+1,' ', sol.x,' ',sol.y );
end.