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.

Download