Cod sursa(job #72084)

Utilizator CezarMocanCezar Mocan CezarMocan Data 12 iulie 2007 17:37:38
Problema Barbar Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.17 kb
const dl:array[1..4]of integer=(-1,1,0,0);
      dc:array[1..4]of integer=(0,0,1,-1);

type poz=record
                x,y:longint;
                end;

var n,m,i,j,p,u:longint;
    c:char;
    v,x:array[1..1000,1..1000]of longint;
    s:array[1..1000000]of poz;
    st,sf:poz;

procedure intoarcerea_dragonului_care_scuipa_flacari;
var d,lnou,cnou:longint;
begin
p:=1;
while p<=u do
        begin
        for d:=1 to 4 do
                begin
                lnou:=s[p].x+dl[d];
                cnou:=s[p].y+dc[d];
                if (lnou>0)and(lnou<=n)and(cnou>0)and(cnou<=m)and(v[lnou,cnou]=-2) then
                        begin
                        v[lnou,cnou]:=v[s[p].x,s[p].y]+1;
                        inc(u);
                        s[u].x:=lnou;
                        s[u].y:=cnou;
                        end;
                end;
        inc(p);
        end;
end;

function posibil(d:longint):boolean;
var k,lnou,cnou:longint;
begin
posibil:=false;
fillchar(x,sizeof(x),0);
p:=1;
u:=1;
s[1]:=st;
x[s[1].x,s[1].y]:=1;
while p<=u do
        begin
        for k:=1 to 4 do
                begin
                lnou:=s[p].x+dl[k];
                cnou:=s[p].y+dc[k];
                if (lnou>0)and(lnou<=n)and(cnou>0)and(cnou<=m)and(v[lnou,cnou]>=d)and(x[lnou,cnou]=0) then
                        begin
                        inc(u);
                        s[u].x:=lnou;
                        s[u].y:=cnou;
                        x[lnou,cnou]:=1;
                        end;
                end;
        inc(p);
        end;
if x[sf.x,sf.y]=1 then
        posibil:=true;
end;


function cauta(ls,ld:longint):longint;
var front,middle,back,sol:longint;
begin
front:=ls;
back:=ld;
while front<=back do
        begin
        middle:=(front+back)div 2;
        if posibil(middle) then
                begin
                front:=middle+1;
                sol:=middle;
                end
        else
                back:=middle-1;
        end;
cauta:=sol;
end;

begin
assign(input,'barbar.in');reset(input);
assign(output,'barbar.out');rewrite(output);
readln(n,m);
for i:=1 to n do
        begin
        for j:=1 to m do
                begin
                read(c);
                case c of
                        '.':v[i,j]:=-2;
                        '*':v[i,j]:=-1;
                        'D':    begin
                                v[i,j]:=0;
                                inc(u);
                                s[u].x:=i;
                                s[u].y:=j;
                                end;
                        'I':    begin
                                v[i,j]:=-2;
                                st.x:=i;
                                st.y:=j;
                                end;
                        'O':    begin
                                v[i,j]:=-2;
                                sf.x:=i;
                                sf.y:=j;
                                end;
                end;
                end;
        readln;
        end;
intoarcerea_dragonului_care_scuipa_flacari;
writeln(cauta(0,v[st.x,st.y]));
close(input);close(output);
end.