Cod sursa(job #599199)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 28 iunie 2011 12:00:01
Problema Barbar Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.5 kb
const mo=10000005;
      dx:array[1..4] of integer=(0,1,0,-1);
      dy:array[1..4] of integer=(1,0,-1,0);
type punct=record x,y:integer; end;
var a:array[0..1001,0..1001] of char;
    b,d:array[0..1001,0..1001] of longint;
    c:array[0..mo+1] of punct;
    p,x,y,x0,y0,n,m,k,i,j,xi,yi,xf,yf,t:longint;

function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;

begin
assign(input,'barbar.in');reset(input);
assign(output,'barbar.out');rewrite(output);
readln(n,m);
k:=0;
for i:=1 to n do
begin
for j:=1 to m do
begin
read(a[i,j]);
d[i,j]:=-1;
b[i,j]:=-1;
case a[i,j] of
'I':begin
xi:=i;yi:=j;
end;
'D':begin
inc(k);
b[i,j]:=0;
c[k].x:=i;
c[k].y:=j;
end;
'0':begin
xf:=i;yf:=j;
end;
end;
end;
readln;
end;
for i:=1 to n do
begin
a[i,0]:='*';
a[i,m+1]:='*';
end;
for i:=1 to m do
begin
a[0,i]:='*';
a[n+1,i]:='*';
end;
p:=1;
while p<>k+1 do
begin
x:=c[p].x;y:=c[p].y;
for i:=1 to 4 do
begin
x0:=c[p].x+dx[i];y0:=c[p].y+dy[i];
if (a[x0,y0]<>'*') and (b[x0,y0]=-1) then
begin
k:=(k+1) mod mo;
c[k].x:=x0;
c[k].y:=y0;
b[x0,y0]:=b[x,y]+1;
end;
end;
p:=(p+1) mod mo;
end;
p:=1;k:=1;
c[1].x:=xi;
c[1].y:=yi;
d[xi,yi]:=b[xi,yi];
while p<>k+1 do
begin
x:=c[p].x;y:=c[p].y;
for i:=1 to 4 do
begin
x0:=c[p].x+dx[i];y0:=c[p].y+dy[i];
if (a[x0,y0]<>'*') then
begin
t:=min(d[x,y],b[x0,y0]);
if t>d[x0,y0] then
begin
k:=(k+1) mod mo;
c[k].x:=x0;
c[k].y:=y0;
d[x0,y0]:=t;
end;
end;
end;
p:=(p+1) mod mo;
end;
writeln(d[xf,yf]);
end.