jzoj 1432. 输油管道

38 篇文章 0 订阅
32 篇文章 0 订阅

Description

  请你帮忙设计一个从城市M到城市Z的输油管道,现在已经把整个区域划分为R行C列,每个单元格可能是空的也可能是以下7种基本管道之一:
  

  油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:

                       


  现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。

Input

  第一行包含两个整数R和C(1<=R,C<=25)。
  接下来R行每行C个字符描述被偷之后的形状,字符分为以下三种:
  (1)‘.’表示空;
  (2)字符‘|’(ASCII为124)、‘-’、‘+’、‘1’、‘2’、‘3’、‘4’描述管道的形状;
  (3)‘M’和‘Z’表示城市,两个都是只出现一次。
  输入保证石油的流向是唯一的,只有一个管道跟M和Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
  输入保证有解而且是唯一的。

Output

  输出被偷走的管道的行号和列号以及管道的类型。

Sample Input

输入1:
3 7
.......
.M-.-Z.
.......

输入2:
3 5
..1-M
1-+..
Z.23.

输入3:
6 10
Z.1----4..
|.|....|..
|..14..M..
2-+++4....
..2323....
..........

Sample Output

输出1:
2 4 -

输出2:
2 4 4

输出3:
3 3 |

Data Constraint

正解

枚举每一个点,然后判断周围的管道,选择即可。
把每一个管道转化为二进制,四个位表示上下左右
比如:上下联通,就是1100
           +就是1111,以此类推。
枚举每个空位,只要能完美地把四周的油运输,就输出类型。

内心P.S.:这题的if太**多了,调了1.5h(已崩溃)

CODE

var
        f:array[0..30,0..30]of string;
        ch:array[0..30,0..30]of char;
        bz:array[1..7]of string=('0101','1001','1010','0110','1100','0011','1111');
        r,c,i,j,k,s:longint;
        ss:string;
begin
        readln(r,c);
        ss:='1234|-+';
        for i:=1 to r do begin
                for j:=1 to c do begin
                        read(ch[i,j]);
                        if (ch[i,j]<>'.')and(ch[i,j]<>'M')and(ch[i,j]<>'Z') then begin
                                for s:=1 to 7 do
                                        if ch[i,j]=ss[s] then begin
                                                f[i,j]:=bz[s];
                                                break;
                                        end;
                        end;
                end;
                readln;
        end;
        for i:=1 to r do begin
                for j:=1 to c do begin
                         if ch[i,j]='.' then begin
                                if (f[i-1,j][2]='1')and(f[i+1,j][1]='1')and(f[i,j-1][4]='1')and(f[i,j+1][3]='1') then begin
                                        writeln(i,' ',j,' ','+');
                                        exit;
                                end;
                                if (f[i-1,j][2]='1')and(f[i+1,j][1]='1') then begin
                                        writeln(i,' ',j,' ','|');
                                        exit;
                                end;
                                if (f[i,j-1][4]='1')and(f[i,j+1][3]='1') then begin
                                        writeln(i,' ',j,' ','-');
                                        exit;
                                end;
                                if (f[i,j+1][3]='1')and(f[i+1,j][1]='1') then begin
                                        writeln(i,' ',j,' ',1);
                                        exit;
                                end;
                                if (f[i-1,j][2]='1')and(f[i,j+1][3]='1') then begin
                                        writeln(i,' ',j,' ',2);
                                        exit;
                                end;
                                if (f[i-1,j][2]='1')and(f[i,j-1][4]='1') then begin
                                        writeln(i,' ',j,' ',3);
                                        exit;
                                end;
                                if (f[i+1,j][1]='1')and(f[i,j-1][4]='1') then begin
                                        writeln(i,' ',j,' ',4);
                                        exit;
                                end;
                         end;
                end;
        end;
end.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值