Sicily 1215: 脱离地牢(BFS)

  这道题按照题意直接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 */

 

posted @ 2017-01-07 16:48  Vincent_Bryan  阅读(389)  评论(0编辑  收藏  举报