Time Limits:
1000 ms Memory Limits: 65536 KB Detailed Limits
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 }