zoukankan      html  css  js  c++  java
  • 【HDOJ】3085 Nightmare Ⅱ

    双向BFS。注意,任何一个点出队后,首先需要考虑ghost。

      1 /* 3085 */
      2 #include <iostream>
      3 #include <queue>
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <cstdlib>
      7 #include <cmath>
      8 using namespace std;
      9 
     10 #define MAXN 805
     11 
     12 typedef struct node_t {
     13     int x, y;
     14     node_t() {}
     15     node_t(int xx, int yy) {
     16         x = xx; y = yy;
     17     }
     18 } node_t;
     19 
     20 int n, m;
     21 node_t z[2], beg0, beg1;
     22 char map[MAXN][MAXN];
     23 bool visit0[MAXN][MAXN];
     24 bool visit1[MAXN][MAXN];
     25 int dir[4][2] = {
     26     -1,0,1,0,0,-1,0,1
     27 };
     28 
     29 inline bool check(int x, int y) {
     30     return x<0 || x>=n || y<0 || y>=m;
     31 }
     32 
     33 inline bool meetZ(int x, int y, int t) {
     34     return abs(x-z[0].x)+abs(y-z[0].y)<=t+t || abs(x-z[1].x)+abs(y-z[1].y)<=t+t;
     35 }
     36 
     37 int bfs() {
     38     int size;
     39     int x, y, t = 0;
     40     int i, j, k, r;
     41     node_t nd;
     42     queue<node_t> Q0;
     43     queue<node_t> Q1;
     44 
     45     memset(visit0, false, sizeof(visit0));
     46     memset(visit1, false, sizeof(visit1));
     47     visit0[beg0.x][beg0.y] = true;
     48     visit1[beg1.x][beg1.y] = true;
     49     Q0.push(beg0);
     50     Q1.push(beg1);
     51 
     52     while (!Q0.empty() || !Q1.empty()) {
     53         ++t;
     54         // Q0
     55         r = 3;
     56         while (r--) {
     57             size = Q0.size();
     58             while (size--) {
     59                 nd = Q0.front();
     60                 Q0.pop();
     61                 if (meetZ(nd.x, nd.y, t))
     62                     continue;
     63                 for (i=0; i<4; ++i) {
     64                     x = nd.x + dir[i][0];
     65                     y = nd.y + dir[i][1];
     66                     if (check(x, y) || visit0[x][y])
     67                         continue;
     68                     if (map[x][y]=='X' || meetZ(x, y, t))
     69                         continue;
     70                     if (visit1[x][y])
     71                         return t;
     72                     visit0[x][y] = true;
     73                     Q0.push(node_t(x, y));
     74                 }
     75             }
     76         }
     77         // Q1
     78         size = Q1.size();
     79         while (size--) {
     80             nd = Q1.front();
     81             Q1.pop();            
     82             if (meetZ(nd.x, nd.y, t))
     83                 continue;
     84             for (i=0; i<4; ++i) {
     85                 x = nd.x + dir[i][0];
     86                 y = nd.y + dir[i][1];
     87                 if (check(x, y) || visit1[x][y])
     88                     continue;
     89                 if (map[x][y]=='X' || meetZ(x, y, t))
     90                     continue;
     91                 if (visit0[x][y])
     92                     return t;
     93                 visit1[x][y] = true;
     94                 Q1.push(node_t(x, y));
     95             }
     96         }
     97     }
     98 
     99     return -1;
    100 }
    101 
    102 int main() {
    103     int t;
    104     int i, j, k;
    105 
    106     #ifndef ONLINE_JUDGE
    107         freopen("data.in", "r", stdin);
    108         freopen("data.out", "w", stdout);
    109     #endif
    110 
    111     scanf("%d", &t);
    112     while (t--) {
    113         scanf("%d %d", &n, &m);
    114         k = 0;
    115         for (i=0; i<n; ++i) {
    116             scanf("%s", map[i]);
    117             for (j=0; j<m; ++j) {
    118                 if (map[i][j] == 'Z') {
    119                     z[k].x = i;
    120                     z[k].y = j;
    121                     ++k;
    122                 } else if (map[i][j] == 'M') {
    123                     beg0.x = i;
    124                     beg0.y = j;
    125                 } else if (map[i][j] == 'G') {
    126                     beg1.x = i;
    127                     beg1.y = j;
    128                 }
    129             }
    130         }
    131         k = bfs();
    132         printf("%d
    ", k);
    133     }
    134 
    135     return 0;
    136 }
  • 相关阅读:
    Java中继承的详细用法
    Java中继承的详细用法
    树莓派中安装QT
    qt在windows下的udp通信(最简单)
    qt+opencv对两幅图片进行融合
    浅谈QT打印功能实现
    qt中采用宽带speex进行网络语音通话实验程序
    实时预览的在线 Markdown 编辑器
    LigerUI一个前台框架增、删、改asp.net代码
    .NET MVC通过反射获取数据修
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4303584.html
Copyright © 2011-2022 走看看