jzoj 1432. 輸油管道

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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章