HDU A计划

本文介绍了一个迷宫救援问题的算法实现,目标是在限定时间内找到并营救被困公主的方法。使用了广度优先搜索策略,考虑了双层迷宫、时空传输机等复杂条件。

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

1
5 5 14
S*#*.
.#...
.....
****.
...#.

..*.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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值