这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而Helen达到(1,2),这种情况也算是相遇。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int _move[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; 4 int visit[25][25][25][25]; 5 int Helen_move[4]; 6 int n,m; 7 char _map[100][100]; 8 struct Node{ 9 int x1, y1;//Paris 10 int x2, y2;//Helen 11 int step; 12 }; 13 14 Node bfs(int x1, int y1, int x2, int y2, int n, int m){ 15 Node front; 16 front.x1 = x1; 17 front.y1 = y1; 18 front.x2 = x2; 19 front.y2 = y2; 20 front.step = 0; 21 queue<Node> q; 22 q.push(front); 23 visit[x1][y1][x2][y2] = 1; 24 while(!q.empty()){ 25 front = q.front(); q.pop(); 26 if(front.step > 255) { 27 return front;//若大于255,则返回 28 } 29 for(int i = 0; i < 4; i++){ 30 int Paris_x = front.x1 + _move[i][0];//走一步 31 int Paris_y = front.y1 + _move[i][1]; 32 if(0 <= Paris_x && Paris_x < n && 0 <= Paris_y && Paris_y < m && 33 _map[Paris_x][Paris_y] != '#' && _map[Paris_x][Paris_y] != '!'){ 34 int k = Helen_move[i]; 35 36 int Helen_x = front.x2 + _move[k][0]; 37 int Helen_y = front.y2 + _move[k][1]; 38 39 if(0 <= Helen_x && Helen_x < n && 0 <= Helen_y && Helen_y < m){ 40 if(_map[Helen_x][Helen_y] == '#'){//撞墙则不走 41 Helen_x = front.x2; 42 Helen_y = front.y2; 43 } 44 else if(_map[Helen_x][Helen_y] == '!') continue;//遇到熔浆 45 46 if(visit[Paris_x][Paris_y][Helen_x][Helen_y] == 1) continue; 47 Node tmp = front; 48 tmp.x1 = Paris_x; 49 tmp.y1 = Paris_y; 50 tmp.x2 = Helen_x; 51 tmp.y2 = Helen_y; 52 tmp.path[tmp.step] = i; 53 tmp.step = front.step + 1; 54 q.push(tmp); 55 visit[Paris_x][Paris_y][Helen_x][Helen_y] = 1; 56 if(Paris_x == Helen_x && Paris_y == Helen_y){//直接相遇 57 return tmp; 58 } 59 if(Paris_x == front.x2 && Paris_y == front.y2 && 60 Helen_x == front.x1 && Helen_y == front.y1){ 61 return tmp;//交差相遇 62 } 63 } 64 65 } 66 } 67 } 68 front.step = 256; 69 return front; 70 } 71 int main(){ 72 cin >> n >> m; 73 74 int x1, y1; 75 int x2, y2; 76 memset(visit, 0, sizeof(visit)); 77 memset(Helen_move, 0, sizeof(Helen_move)); 78 for(int i = 0; i < n; i++){ 79 for(int j = 0; j < m; j++){ 80 cin >> _map[i][j]; 81 if(_map[i][j] == 'P'){//Paris的位置 82 x1 = i; 83 y1 = j; 84 } 85 if(_map[i][j] == 'H'){//Helen的位置 86 x2 = i; 87 y2 = j; 88 } 89 } 90 } 91 92 for(int i = 0; i < 4; i++){ 93 char c; 94 cin >> c; 95 if(c == 'N')Helen_move[i] = 0;//Paris走时Helen的方向 96 else if(c == 'S')Helen_move[i] = 1; 97 else if(c == 'W')Helen_move[i] = 2; 98 else if(c == 'E')Helen_move[i] = 3; 99 } 100 Node tmp = bfs(x1, y1, x2, y2, n, m); 101 if(tmp.step > 255) cout << "Impossible" << endl; 102 else{ 103 cout << tmp.step << endl; 104 } 105 106 } 107 108 /* 109 5 5 110 ##### 111 #P#.# 112 #H!.# 113 #.#.# 114 ##### 115 WNSE 116 */