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.

Download