Cod sursa(job #254930)
Utilizator | Data | 8 februarie 2009 09:38:59 | |
---|---|---|---|
Problema | Kdrum | Scor | 0 |
Compilator | fpc | Status | done |
Runda | Arhiva de probleme | Marime | 3.31 kb |
program jiji;
var f:text;
i,j,n,m,k,x1,x2,y1,y2,l,min,nr,ls,ld,lung,x,y:longint;
cx,cy:array[1..100000] of longint;
a,b:array[0..51,0..51] of longint;
gasit:boolean;
begin
assign(f,'kdrum.in');
reset(f);
readln(f,n,m,k);
readln(f,x1,y1,x2,y2);
for i:=1 to n do
for j:=1 to m do begin
read(f,a[i,j]);
if a[i,j]=0 then b[i,j]:=3000
end;
{BORDEZ MATRICEA B CU 3000}
for i:=0 to n+1 do begin
b[i,0]:=3000;
b[i,m+1]:=3000
end;
for i:=0 to m+1 do begin
b[0,i]:=3000;
b[n+1,i]:=3000
end;
{INITIALIZEZ O COADA CU PUNCTUL DE PORNIRE}
b[x1,y1]:=1;
nr:=1;
cx[1]:=x1;
cy[1]:=y1;
ls:=1;
ld:=1;
gasit:=false;
{ADAUG IN COADA VECINII PUNCTULUI CURENT
CAT TIMP N-AM AJUNS LA DESTINATIE}
while not gasit do
begin
gasit:=true;
if b[cx[ls],cy[ls]+1]=0 then begin
nr:=nr+1;
ld:=ld+1;
cx[ld]:=cx[ls];
cy[ld]:=cy[ls]+1;
b[cx[ls],cy[ls]+1]:=nr;
gasit:=false;
end;
if b[cx[ls],cy[ls]-1]=0 then begin
nr:=nr+1;
ld:=ld+1;
cx[ld]:=cx[ls];
cy[ld]:=cy[ls]-1;
b[cx[ls],cy[ls]-1]:=nr;
gasit:=false
end;
if b[cx[ls]+1,cy[ls]]=0 then begin
nr:=nr+1;
ld:=ld+1;
cx[ld]:=cx[ls]+1;
cy[ld]:=cy[ls];
b[cx[ls]+1,cy[ls]]:=nr;
gasit:=false
end;
if b[cx[ls]-1,cy[ls]]=0 then begin
nr:=nr+1;
ld:=ld+1;
cx[ld]:=cx[ls]-1;
cy[ld]:=cy[ls];
b[cx[ls]-1,cy[ls]]:=nr;
gasit:=false
end;
ls:=ls+1;
end;
{PARCURG DRUMUL INAPOI}
lung:=1;
x:=x2;
y:=y2;
gasit:=false;
while not gasit do
begin
if b[x+1,y]<b[x-1,y] then min:=b[x+1,y]
else min:=b[x-1,y];
if b[x,y+1]<min then min:=b[x,y+1];
if b[x,y-1]<min then min:=b[x,y-1];
if min=b[x+1,y] then x:=x+1;
if min=b[x-1,y] then x:=x-1;
if min=b[x,y+1] then y:=y+1;
if min=b[x,y-1] then y:=y-1;
lung:=lung+1;
if (x=x1)and(y=y1)then gasit:=true
end;
close(f);
assign(f,'kdrum.out');
rewrite(f);
writeln(f,lung);
close(f);
end.