CIJEVI - Cijevi

Tác giả: khuc_tuan

Ngôn ngữ: Pascal

//{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q+,R+,S+,T-,U-,V+,W-,X+,Y+,Z1}
// {$APPTYPE CONSOLE}
 {$mode delphi}

const
    dx : array[0..3] of integer = (-1,0,1,0);
    dy : array[0..3] of integer = (0,1,0,-1);

var
    z, x, y, h, i, j, m, n : integer;
    a : array[1..100,0..100] of char;
    mark : array[1..100,1..100] of integer;
    data : array[Char] of integer;
    ok : boolean;
    s : array[0..7] of char = '|-+1234'#0;

function inside(x,y : integer) : boolean;
begin
    inside := (x>=1) and (x<=m) and (y>=1) and (y<=n);
end;

procedure go(x,y,h : integer);
var
    nh, t, s : integer;
begin
    if a[x,y]='.' then
    begin
        mark[x,y] := mark[x,y] or (1 shl ((h+2) mod 4));
        exit;
    end;
    s := 0;
    for t:=0 to 3 do if (data[a[x,y]] and (1 shl t)) <> 0 then s := s + t;
    nh := s - (h + 2) mod 4;
    if a[x,y]='+' then nh := h;
    go( x + dx[nh], y + dy[nh], nh);            
end;

begin
    data['|'] := 1 or 4;
    data['-'] := 2 or 8;
    data['+'] := 1 or 2 or 4 or 8;
    data['1'] := 2 or 4;
    data['2'] := 1 or 2;
    data['3'] := 1 or 8;
    data['4'] := 4 or 8;
    
    readln(m,n);
    for i:=1 to m do
    begin
        readln(a[i]);
        move(a[i][0], a[i][1], 50);
    end;
    for i:=1 to m do
        for j:=1 to n do
            if (a[i,j]='M') or (a[i,j]='Z') then
            begin
                ok := false;
                for h:=0 to 3 do
                begin
                    x := i + dx[h];
                    y := j + dy[h];
                    if inside(x,y) and (a[x,y]<>'.') and ((data[a[x,y]] and (1 shl ((h+2) mod 4)))<>0)then
                    begin
                        ok := true;
                        go(x,y,h);
                    end;
                end;
                if not ok then
                begin
                    for h:=0 to 3 do
                    begin
                        x := i + dx[h];
                        y := j + dy[h];
                        if inside(x,y) and (a[x,y]='.') then mark[x,y] := mark[x,y] or (1 shl ((h+2) mod 4));
                    end;
                end;
            end;
    for i:=1 to m do
        for j:=1 to n do
            for z:=0 to 6 do
                if mark[i,j] = data[s[z]] then
                begin
                    ok := false;
                    for h:=0 to 3 do if (mark[i,j] and (1 shl h)) = 0 then
                    begin
                        x := i + dx[h];
                        y := j + dy[h];
                        if inside(x,y) and (not (a[x,y] in ['Z','M','.'])) and ((data[a[x,y]] and (1 shl((h+2) mod 4)))<>0) then
                            ok := true;
                    end;
                    if ok then writeln(i,#32,j,#32,'+')
                    else writeln(i,#32,j,#32,s[z]);
                    exit;
                end;
end.

Download