MLASERP - Laser Phones
Tác giả: ladpro98
Ngôn ngữ: Pascal
program mlaser;
uses math;
type e=record
x,y:longint;
end;
const maxn=110;
fi='';
dx:array[1..4] of longint = (-1,0,0,1);
dy:array[1..4] of longint = (0,1,-1,0);
var a:array[1..maxn,1..maxn] of char;
check:array[1..maxn,1..maxn] of boolean;
p:array[1..maxn,1..maxn] of longint;
s:array[1..2] of e;
q:array[1..maxn*maxn] of e;
m,n,d:longint;
procedure input;
var inp:text;
i,j:longint;
begin
assign(inp,fi);reset(inp);
readln(inp,n,m);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(inp,a[i,j]);
if a[i,j]='C' then
begin
inc(d);
s[d].x:=i;
s[d].y:=j;
end;
end;
readln(inp);
end;
close(inp);
end;
procedure bfs;
var l,r,i,x,y:longint;
u:e;
begin
l:=1;r:=1;
q[1]:=s[1];
check[s[1].x,s[1].y]:=true;
p[s[1].x,s[1].y]:=-1;
while l<=r do
begin
u:=q[l];inc(l);
for i:=1 to 4 do
begin
x:=u.x;y:=u.y;
while true do
begin
x:=x+dx[i];
y:=y+dy[i];
if (1<=x) and (x<=m) and (1<=y) and (y<=n)
and (a[x,y]<>'*') then
begin
if not check[x,y] then
begin
inc(r);
q[r].x:=x;
q[r].y:=y;
check[x,y]:=true;
p[x,y]:=p[u.x,u.y]+1;
if (x=s[2].x) and (y=s[2].y) then exit;
end;
end
else break;
end;
end;
end;
end;
begin
input;
bfs;
write(p[s[2].x,s[2].y]);
end.