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.