zoukankan      html  css  js  c++  java
  • 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 */
  • 相关阅读:
    优雅解决Windows版Emacs的home路径的问题
    不容忽视的警告:默认库msvcrt.lib与其他库的使用冲突,请使用/NODEFAULTLIB:library
    搜狗浏览器也可以直接安装Chrome插件,太棒了
    给phpMyAdmin修改root密码后出现访问被拒绝的问题的解决办法
    给Eclipse替换镜像
    centos7 添加系统盘作为本地yum源
    python的学习内容
    列表
    Oracle-创建用户和表空间
    linux下oracle的启动和停止
  • 原文地址:https://www.cnblogs.com/Vincent-Bryan/p/6259739.html
Copyright © 2011-2022 走看看