Time Limits:
1000 ms Memory Limits: 65536 KB Detailed Limits
Description
请你帮忙设计一个从城市M到城市Z的输油管道,现在已经把整个区域划分为R行C列,每个单元格可能是空的也可能是以下7种基本管道之一:
油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:
现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。
油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:
现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。
Input
第一行包含两个整数R和C(1<=R,C<=25)。
接下来R行每行C个字符描述被偷之后的形状,字符分为以下三种:
(1)‘.’表示空;
(2)字符‘|’(ASCII为124)、‘-’、‘+’、‘1’、‘2’、‘3’、‘4’描述管道的形状;
(3)‘M’和‘Z’表示城市,两个都是只出现一次。
输入保证石油的流向是唯一的,只有一个管道跟M和Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
输入保证有解而且是唯一的。
接下来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 }