poj 3083
1 #include <iostream> 2 #include <limits> 3 #include <queue> 4 using namespace std; 5 6 typedef pair<int, int> P; 7 8 char maze[41][41]; 9 int dist[41][41]; 10 int spDirX[4] = {1, 0, -1, 0}; 11 int spDirY[4] = {0, 1, 0, -1}; 12 int n; 13 int w, h; 14 int startX, startY; 15 int endX, endY; 16 const int INF = numeric_limits<int>::max(); 17 int sp, lo, ro; 18 int dx[4] = { 19 0, 1, 0, -1 20 }; 21 int dy[4] = { 22 -1, 0, 1, 0 23 }; 24 void leftOrder(int x, int y, int sum, int dir) 25 { 26 //ÖÕÖ¹ 27 if(x == endX && y == endY) 28 { 29 lo = sum; 30 return ; 31 } 32 //µÚÒ»¸öÔªËØÈ·¶¨·½Ïò 33 if(sum == 1) 34 { 35 for(int i = 0; i < 4; ++i) 36 { 37 int nx = x + dx[i]; 38 int ny = y + dy[i]; 39 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] == '.') 40 { 41 leftOrder(nx, ny , sum+1, i); 42 break; 43 } 44 45 } 46 } 47 else 48 { 49 //Ò»°ãÇé¿ö 50 dir = (dir+3) % 4; 51 for(int i = 0; i < 4; ++i) 52 { 53 int nx = x + dx[(dir+i)%4]; 54 int ny = y + dy[(dir+i)%4]; 55 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] != '#') 56 { 57 leftOrder(nx, ny , sum+1, (dir+i)%4); 58 break; 59 } 60 } 61 } 62 63 } 64 65 void rightOrder(int x, int y, int sum, int dir) 66 { 67 //ÖÕÖ¹ 68 if(x == endX && y == endY) 69 { 70 ro = sum; 71 return ; 72 } 73 //µÚÒ»¸öÔªËØÈ·¶¨·½Ïò 74 if(sum == 1) 75 { 76 for(int i = 0; i < 4; ++i) 77 { 78 int nx = x + dx[i]; 79 int ny = y + dy[i]; 80 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] == '.') 81 { 82 rightOrder(nx, ny , sum+1, i); 83 break; 84 } 85 86 } 87 } 88 else 89 { 90 //Ò»°ãÇé¿ö 91 dir = (dir+1) % 4; 92 for(int i = 0; i < 4; ++i) 93 { 94 int nx = x + dx[(dir-i+4)%4]; 95 int ny = y + dy[(dir-i+4)%4]; 96 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] != '#') 97 { 98 rightOrder(nx, ny , sum+1, (dir-i+4)%4); 99 break; 100 } 101 } 102 } 103 104 } 105 106 int shortPath() 107 { 108 queue<P> que; 109 dist[startY][startX] = 1; 110 que.push(P(startX, startY)); 111 while(que.size()) 112 { 113 P temp = que.front(); 114 que.pop(); 115 if(temp.first == endX && temp.second == endY) 116 break; 117 for(int i = 0; i < 4; ++i) 118 { 119 int nx = temp.first + spDirX[i]; 120 int ny = temp.second + spDirY[i]; 121 if(nx >= 0 && ny >= 0 && nx < w && ny < h && dist[ny][nx] == INF && maze[ny][nx] != '#') 122 { 123 que.push(P(nx, ny)); 124 dist[ny][nx] = dist[temp.second][temp.first] + 1; 125 } 126 } 127 } 128 sp = dist[endY][endX]; 129 } 130 131 132 int main() 133 { 134 cin >> n; 135 for(int i = 0; i < n; ++i) 136 { 137 cin >> w >> h; 138 for(int j = 0; j < h; ++j) 139 { 140 for(int k = 0; k < w; ++k) 141 { 142 cin >> maze[j][k]; 143 dist[j][k] = INF; 144 if(maze[j][k] == 'S') 145 { 146 startX = k; 147 startY = j; 148 } 149 if(maze[j][k] == 'E') 150 { 151 endX = k; 152 endY = j; 153 } 154 } 155 } 156 leftOrder(startX, startY, 1, 0); 157 rightOrder(startX, startY, 1, 0); 158 shortPath(); 159 cout << lo << " " << ro << " " << sp << endl; 160 } 161 return 0; 162 }