HDU A计划

来源:互联网 发布:快手后期制作视频软件 编辑:程序博客网 时间:2024/05/18 09:33

A计划

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 178   Accepted Submission(s) : 71

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

Input

输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

Output

如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

Sample Input

15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..

Sample Output

YES

#include<iostream>
#include<cstdio>
#include<queue>
int n, m, t, d[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
char a[2][11][11];
using namespace std;
struct node
{
    int x, y, z, T;
};
int main()
{
    int C; scanf_s("%d", &C);
    while (C--)
    {
        scanf_s("%d%d%d", &n, &m, &t);
        int x4, y4, z4;
        for (int i = 0; i < 2; i++)
            for (int j = 0; j < n; j++)
                cin >> a[i][j];
        for (int i = 0; i < 2; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < m; k++)
                {
                    if (a[i][j][k] == 'S') x4 = i, y4 = j, z4 = k;
                    if (a[i][j][k] == '#'&&a[i ^ 1][j][k] == '#')
                        a[i][j][k] = '*', a[i ^ 1][j][k] = '*';
                    if (a[i][j][k] == '#'&&a[i ^ 1][j][k] == '*')
                        a[i][j][k] = '*';
                }
        queue<node> P; bool bb = 0; a[x4][y4][z4] = '*';
        node dc1; dc1.x = x4, dc1.y = y4, dc1.z = z4, dc1.T = 0;
        P.push(dc1);
        while (!P.empty())
        {
            node dr = P.front(); P.pop();
            if (a[dr.x][dr.y][dr.z] == 'P')
            {
                if (dr.T <= t)
                {
                    bb = 1; printf("YES\n"); break;
                }
                else break;
            }
            for (int i = 0; i < 4; i++)
            {
                int x1 = dr.x, y1 = dr.y + d[i][0], z1 = dr.z + d[i][1], T1 = dr.T + 1;
                if (y1 >= 0 && y1 < n&&z1 >= 0 && z1 < m&&T1 <= t)
                {
                    if (a[x1][y1][z1] == '#')
                    {
                        if (a[x1 ^ 1][y1][z1] == '*') continue;
                        a[x1][y1][z1] = '*';
                        node dc2; dc2.x = x1 ^ 1, dc2.y = y1, dc2.z = z1, dc2.T = T1;
                        P.push(dc2);
                    }
                    if (a[x1][y1][z1] == '.')
                    {
                        a[x1][y1][z1] = '*';
                        node dc3; dc3.x = x1, dc3.y = y1, dc3.z = z1, dc3.T = T1;
                        P.push(dc3);
                    }
                    if (a[x1][y1][z1] == 'P')
                    {
                        node dc; dc.x = x1, dc.y = y1, dc.z = z1, dc.T = T1;
                        P.push(dc);
                    }
                }
            }
        }
        if (bb == 0) printf("NO\n");
        while (!P.empty()) P.pop();
    }
    return 0;
}