JZ高中OJ 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 |
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int MAXRC = 25+5;
  4 const int cmpdis[4][2] = { {0, -1}, {1, 0}, {0, 1}, {-1, 0} };
  5 const int cmppipe[5][2] = { {0, 0}, {1, 2}, {3, 2}, {3, 0}, {1, 0} };
  6 
  7 char g[MAXRC][MAXRC];
  8 
  9 int r, c, sx, sy, fx, fy;
 10 
 11 inline bool SF (int x, int y) {
 12     return (x == fx && y == fy || x == sx && y == sy);
 13 }
 14 
 15 inline void check (int x, int y, int dis) {
 16     int i=dis;
 17     if ((g[x+1][y] == '|' || SF(x+1, y) || g[x+1][y] == '2' || g[x+1][y] == '3' || g[x+1][y] == '+') && (g[x-1][y] == '|' || SF(x-1, y) || g[x-1][y] == '1' || g[x-1][y] == '4' || g[x-1][y] == '+') && (g[x][y-1] == '-' || SF(x, y-1) || g[x][y-1] == '1' || g[x][y-1] == '2' || g[x][y-1] == '+') && (g[x][y+1] == '-' || SF(x, y+1) || g[x][y+1] == '4' || g[x][y+1] == '3' || g[x][y+1] == '+')) {
 18         printf ("%d %d +\n", x, y);
 19         exit (0);
 20     }
 21     if ((dis == 0)) {
 22         int nx=x + cmpdis[i][0];
 23         int ny=y + cmpdis[i][1];
 24         if (g[nx][ny] == '-' || g[nx][ny] == '+' || g[nx][ny] == '1' || g[nx][ny] == '2' || SF (nx, ny)){
 25             printf ("%d %d -\n", x, y);
 26             exit(0);
 27         }
 28     }
 29     if ((dis == 2)) {
 30         int nx=x + cmpdis[i][0];
 31         int ny=y + cmpdis[i][1];
 32         if (g[nx][ny] == '-' || g[nx][ny] == '+' || g[nx][ny] == '3' || g[nx][ny] == '4' || SF (nx, ny)){
 33             printf ("%d %d -\n", x, y);
 34             exit(0);
 35         }
 36     }
 37     if ((dis == 1)) {
 38         int nx=x + cmpdis[i][0];
 39         int ny=y + cmpdis[i][1];
 40         if (g[nx][ny] == '|' || g[nx][ny] == '+' || g[nx][ny] == '3' || g[nx][ny] == '2' || SF (nx, ny)){
 41             printf ("%d %d |\n", x, y);
 42             exit(0);
 43         }
 44     }
 45     if ((dis == 3)) {
 46         int nx=x + cmpdis[i][0];
 47         int ny=y + cmpdis[i][1];
 48         if (g[nx][ny] == '|' || g[nx][ny] == '+' || g[nx][ny] == '1' || g[nx][ny] == '4' || SF (nx, ny)){
 49             printf ("%d %d |\n", x, y);
 50             exit(0);
 51         }
 52     }
 53     if (dis == 3) {
 54         if (g[x][y+1] == '-' || g[x][y+1] == '+' || g[x][y+1] == '3' || g[x][y+1] == '4' || SF (x, y+1)) {
 55             printf ("%d %d 1\n", x, y);
 56             exit(0);
 57         }
 58     }
 59     if (dis == 0) {
 60         if (g[x+1][y] == '|' || g[x+1][y] == '+' || g[x+1][y] == '2' || g[x+1][y] == '3' || SF (x+1, y)) {
 61             printf ("%d %d 1\n", x, y);
 62             exit(0);
 63         }
 64     }
 65     if (dis == 1) {
 66         if (g[x][y+1] == '-' || g[x][y+1] == '+' || g[x][y+1] == '3' || g[x][y+1] == '4' || SF (x, y+1)) {
 67             printf ("%d %d 2\n", x, y);
 68             exit(0);
 69         }
 70     }
 71     if (dis == 0) {
 72         if (g[x-1][y] == '|' || g[x-1][y] == '+' || g[x-1][y] == '1' || g[x-1][y] == '4' || SF (x-1, y)) {
 73             printf ("%d %d 2\n", x, y);
 74             exit(0);
 75         }
 76     }
 77     if (dis == 2) {
 78         if (g[x-1][y] == '|' || g[x-1][y] == '+' || g[x-1][y] == '1' || g[x-1][y] == '4' || SF (x-1, y)) {
 79             printf ("%d %d 3\n", x, y);
 80             exit(0);
 81         }
 82     }
 83     if (dis == 1) {
 84         if (g[x][y-1] == '-' || g[x][y-1] == '+' || g[x][y-1] == '1' || g[x][y-1] == '2' || SF (x, y-1)) {
 85             printf ("%d %d 3\n", x, y);
 86             exit(0);
 87         }
 88     }
 89     if (dis == 2) {
 90         if (g[x+1][y] == '|' || g[x+1][y] == '+' || g[x+1][y] == '2' || g[x+1][y] == '3' || SF (x+1, y)) {
 91             printf ("%d %d 4\n", x, y);
 92             exit(0);
 93         }
 94     }
 95     if (dis == 3) {
 96         if (g[x][y-1] == '-' || g[x][y-1] == '+' || g[x][y-1] == '1' || g[x][y-1] == '2' || SF (x, y-1)) {
 97             printf ("%d %d 4\n", x, y);
 98             exit(0);
 99         }
100     }
101     return;
102 }
103         
104 void dfs (int x, int y, int dis) {
105     if (dis == -1) {
106         for (int i=0; i<4; i++) {
107             int nx=x + cmpdis[i][0];
108             int ny=y + cmpdis[i][1];
109             if (nx < 1 || nx > r || ny < 1 || ny > c) continue;
110             if (g[nx][ny] == '.') {
111                 check(nx, ny, i);
112                 continue;
113             }
114             if (1 <= g[nx][ny] - '0' && g[nx][ny] - '0' <=4) {
115                 dfs (nx, ny, cmppipe[g[nx][ny] - '0'][i%2]);
116                 return;
117             }
118             else {
119                 dfs (nx, ny, i);
120                 return;
121             }
122         }
123     }
124     int nx=x + cmpdis[dis][0];
125     int ny=y + cmpdis[dis][1];
126     if (g[nx][ny] == '.') {
127         check(nx, ny, dis);
128     }
129     if (1 <= g[nx][ny] - '0' && g[nx][ny] - '0' <=4) {
130         dfs (nx, ny, cmppipe[g[nx][ny] - '0'][dis%2]);
131         return;
132     }
133     else {
134         dfs (nx, ny, dis);
135         return;
136     }
137     return;
138 }
139 
140 int main() {
141     cin>>r>>c;
142     for (int i=1; i<=r; i++) {
143         for (int j=1; j<=c; j++) {
144             char ch;
145             cin >>ch;
146             g[i][j]=ch;
147             if (g[i][j] == 'M') {
148                 sx=i;
149                 sy=j;
150             }
151             if (g[i][j] == 'Z') {
152                 fx=i;
153                 fy=j;
154             }
155         }
156     }
157     dfs (sx,sy,-1);
158     return 0;
159 }

猜你喜欢

转载自www.cnblogs.com/anbujingying/p/11306766.html