CIJEVI - Cijevi
Tác giả: flashmt
Ngôn ngữ: Pascal
const maxn=25;
dx:array[1..4] of shortint=(-1,0,1,0);
dy:array[1..4] of shortint=(0,1,0,-1);
var m,n,rex,rey,x,y,x1,y1,pre,pre1:byte;
rec:char;
s:array[0..1,0..1] of byte;
a:array[1..maxn,1..maxn,1..maxn,1..maxn] of byte;
b:array[1..maxn,1..maxn] of char;
d:array[1..maxn,1..maxn] of byte;
function max(a,b:byte):byte;
begin
if a>b then max:=a else max:=b;
end;
procedure rf;
var i,j:byte; c:char;
begin
fillchar(a,sizeof(a),0);
readln(m,n);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(c);
b[i,j]:=c;
if c='M' then
begin
s[0,0]:=i; s[0,1]:=j;
end;
if c='Z' then
begin
s[1,0]:=i; s[1,1]:=j;
end;
if (c='|') or (c='+') or (c='1') or (c='4') then
begin
a[i,j,i+1,j]:=1;
a[i+1,j,i,j]:=1;
end;
if (c='|') or (c='+') or (c='2') or (c='3') then
begin
a[i,j,i-1,j]:=1;
a[i-1,j,i,j]:=1;
end;
if (c='-') or (c='+') or (c='1') or (c='2') then
begin
a[i,j,i,j+1]:=1;
a[i,j+1,i,j]:=1;
end;
if (c='-') or (c='+') or (c='3') or (c='4') then
begin
a[i,j,i,j-1]:=1;
a[i,j-1,i,j]:=1;
end;
end;
readln;
end;
fillchar(d,sizeof(d),0);
end;
function check(p,q:byte):boolean;
begin
check:=(p>0) and (q>0) and (p<=m) and (q<=n);
end;
procedure go(k:byte);
var j,xt,yt:byte; kt:boolean;
begin
x:=s[k,0]; y:=s[k,1];
d[x,y]:=1;
for j:=1 to 4 do
begin
xt:=x+dx[j]; yt:=y+dy[j];
if check(xt,yt) and (a[x,y,xt,yt]=1) then
begin
a[x,y,xt,yt]:=0;
a[xt,yt,x,y]:=0;
x:=xt; y:=yt;
d[x,y]:=1;
pre:=j;
break;
end;
end;
while true do
begin
if b[x,y]='+' then
begin
xt:=x+dx[pre]; yt:=y+dy[pre];
if (a[x,y,xt,yt]=1) and (b[xt,yt]<>'.') then
begin
a[x,y,xt,yt]:=0;
a[xt,yt,x,y]:=0;
x:=xt; y:=yt;
d[x,y]:=1;
end
else break;
end
else
begin
kt:=false;
for j:=1 to 4 do
begin
xt:=x+dx[j]; yt:=y+dy[j];
if check(xt,yt) and (a[x,y,xt,yt]=1) and (b[xt,yt]<>'.') then
begin
a[x,y,xt,yt]:=0;
a[xt,yt,x,y]:=0;
x:=xt; y:=yt;
pre:=j;
d[x,y]:=1;
kt:=true;
break;
end;
end;
if not kt then break;
end;
end;
if b[x,y]='1' then
begin
if pre=4 then pre:=3 else pre:=2;
end;
if b[x,y]='2' then
begin
if pre=3 then pre:=2 else pre:=1;
end;
if b[x,y]='3' then
begin
if pre=2 then pre:=1 else pre:=4;
end;
if b[x,y]='4' then
begin
if pre=1 then pre:=4 else pre:=3;
end;
end;
procedure pr;
var i,j:byte; kt:boolean;
begin
go(0);
x1:=x; y1:=y; pre1:=pre;
go(1);
kt:=false;
for i:=1 to m do
for j:=1 to n do
if (d[i,j]=0) and (b[i,j]<>'.') then kt:=true;
if x=x1 then
begin
rex:=x;
rey:=(y+y1) div 2;
rec:='-';
end;
if y=y1 then
begin
rex:=(x+x1) div 2;
rey:=y;
rec:='|';
end;
if x1+y1=x+y then
begin
if (pre=3) or (pre1=3) then
begin
rex:=max(x,x1);
rey:=max(y,y1);
rec:='3';
end
else
begin
rex:=x+x1-max(x,x1);
rey:=y+y1-max(y,y1);
rec:='1';
end;
end;
if x1+y=x+y1 then
begin
if (pre=3) or (pre1=3) then
begin
rex:=max(x,x1);
rey:=y+y1-max(y,y1);
rec:='2';
end
else
begin
rex:=x+x1-max(x,x1);
rey:=max(y,y1);
rec:='4';
end;
end;
if kt then rec:='+';
end;
procedure wf;
begin
write(rex,' ',rey,' ',rec);
end;
begin
rf;
pr;
wf;
end.