HDU 2102 BFS

/*
坑点有:
两层相对位置都是#的情况不可取
T时刻到达公主处可取
*/

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10 + 5;
char g[MAXN][MAXN][MAXN];
int dp[MAXN][MAXN][MAXN];
int n, m, T;
struct Node
{
    int x, y, z;
    Node(){}
    Node(int _x, int _y, int _z) {x = _x, y = _y, z = _z;}
};
queue<Node>que;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
bool validPos(int x, int y) {if(x >= 0 && x < n && y >= 0 && y < m) return true; else return false;}
int main()
{
    int Cas;
    scanf("%d", &Cas);
    while(Cas--) {
        scanf("%d%d%d", &n, &m, &T);
        for(int i = 0 ; i < 2 ; i++) for(int j = 0 ; j < n ; j++) scanf("%s", g[i][j]);
        memset(dp, -1, sizeof dp);
        int x, y, z;
// for(int i = 0 ; i < 2 ; i++) for(int j = 0 ; j < n ; j++) for(int k = 0 ; k < m ; k++)
// if(g[i][j][k] == 'S') x = i, y = j, z = k;
// dp[x][y][z] = 0;
        while(!que.empty()) que.pop();
// que.push(Node(y, z, x));
        que.push(Node(0,0,0));
        dp[0][0][0] = 0;
        while(!que.empty()) {
            Node node = que.front(); que.pop();
            if(dp[node.z][node.x][node.y] >= T) continue;
            for(int i = 0 ; i < 4 ; i++) {
                int tx = node.x + dx[i];
                int ty = node.y + dy[i];
                if(!validPos(tx, ty) || g[node.z][tx][ty] == '*') continue;
                if(dp[node.z][tx][ty] == -1 || dp[node.z][tx][ty] > dp[node.z][node.x][node.y] + 1) {
                    dp[node.z][tx][ty] = dp[node.z][node.x][node.y] + 1;
                    if(g[node.z][tx][ty] == '#' && g[1 - node.z][tx][ty] != '*' && g[1 - node.z][tx][ty] != '#') {
                        if(dp[1 - node.z][tx][ty] == -1 || dp[1 - node.z][tx][ty] > dp[node.z][node.x][node.y] + 1) {
                            dp[1 - node.z][tx][ty] = dp[node.z][node.x][node.y] + 1;
                            que.push(Node(tx, ty, 1 - node.z));
                        }
                    }
                    if(g[node.z][tx][ty] != '#')
                        que.push(Node(tx, ty, node.z));
                }
            }
        }
// for(int i = 0 ; i < 2 ; i++) {
// for(int j = 0 ; j < n ; j++) {
// for(int k = 0 ; k < m ; k++) printf("%d ", dp[i][j][k]);
// printf("\n");
// }
// puts("");
// }
        for(int i = 0 ; i < 2 ; i++) for(int j = 0 ; j < n ; j++) for(int k = 0 ; k < m ; k++) if(g[i][j][k] == 'P') x=i,y=j,z=k;
        if(dp[x][y][z] <= T && dp[x][y][z] != -1) puts("YES");
        else puts("NO");
    }
    return 0;
}

你可能感兴趣的:(HDU 2102 BFS)