B - Xiper的奇妙历险(2)

来源:互联网 发布:java程序员考证 编辑:程序博客网 时间:2024/04/30 20:19

B - Xiper的奇妙历险(2)

Time Limit: 3000/1000MS (Java/Others)
题目链接:
http://acm.uestc.edu.cn/#/contest/show/99

题目:

转眼间,已经过了10年。
Xiper和日天都以优异的成绩,从UESTC毕业了。
毕业之后,Xiper每天勤奋地写代码。然而不知为何,Xiper总觉得自己的智商越来越低了。
久而久之,Xiper对日天产生了怀疑。经过的一番调查,Xiper发现日天竟然在程序里下毒!
日天面对Xiper和前来拘留他的潘警察,假意痛哭流涕,并要求Xiper亲手给他带上手铐。
然而就在Xiper准备给日天带上手铐时,日天微微一笑,竟从背后掏出了一条咸鱼!
“我不做人啦,Xiper!”
潘警官赶忙掏出光剑,向日天砍去。不料成为咸鱼王的日天已然是刀枪不入,毫发无损。
面对强大的日天,Xiper丝毫不慌,他示意潘警官在豪宅外守候,自己只身迎战。
Xiper的智商碾压之下,日天被诱入火海之中。被火焰包围的日天发出一阵阵的惨叫声,怕是药丸。
现在,已经打败了日天的Xiper要尽快逃出这间在熊熊燃烧的祖传豪宅。
为了简化问题,我们将房子简化成一个N层楼,每层楼对应一个LR列的网格图,并用不同的字符表示每个格点的状态。

.—— 表示该位置为空。

x—— 表示该位置上有障碍,不能移动。

U—— 表示上楼的楼梯入口。

D—— 表示下楼的楼梯入口。

X—— 表示Xiper现在所在的位置。

Y —— 表示Xiper要到达的出口的位置,保证在第一层楼的边界上。
每秒Xiper可以向前后左右移动一格,或者从楼梯的入口到对应的出口。Xiper不能移动到边界外的地方,也不能移动到障碍上。
保证顶楼没有上楼入口,底层没有下楼入口,每个下楼入口对应的出口只会是上楼入口或者障碍,反之亦然。
一个上楼入口只会对应一个下楼入口,且所在层数相邻,所处的行和列一致,反之亦然。
注意,同一层楼可能存在多个楼梯;当楼梯入口对应的出口被障碍堵住时,Xiper就无法到达出口的位置了。
现在Xiper想知道,他最少要用多少时间能逃出来?

Input
第一行三个数字NLR(1<=N,L,R<=50),表示豪宅的大小。
接下来从第1层开始依次输入;对于每一层,用L行个长度为R的字符串表示该层的状态。

Output
如果可以到达,输出一个数STEP,表示所需最少的步数。否则输出1

Sample Input

1 1 2XY12 2 2YU..XDxx

Sample Output

3

分析:
题目大概就是有第三维迷宫了,要从X走到Y,如果下楼或上楼的时候遇到障碍则走不到终点。
三维bfs~

代码:

#include<cstdio>#include<queue>using namespace std;int n, l, r;const int maxn = 51;struct node{    int x, y, z;};node make_node(int a, int b, int c){    node tmp;    tmp.x = a;    tmp.y = b;    tmp.z = c;    return tmp;}node st, en;int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };int d[maxn][maxn][maxn];char mp[maxn][maxn][maxn];void init(){    for (int i = 0; i<51; i++)        for (int j = 0; j<51; j++)            for (int k = 0; k<51; k++)                d[i][j][k] = -1;}int bfs()///it has begin and end{    init();    queue<node>que;    que.push(st);    d[st.z][st.x][st.y] = 0;    while (!que.empty())    {        node p = que.front();        que.pop();        if (mp[p.z][p.x][p.y] == 'Y')break;        for (int i = 0; i<4; i++)        {            int nx = p.x + dx[i], ny = p.y + dy[i];            if (nx >= 0 && nx<l&&ny >= 0 && ny <= r&&d[p.z][nx][ny] == -1 && mp[p.z][nx][ny] != 'x')            {                d[p.z][nx][ny] = d[p.z][p.x][p.y] + 1;                que.push(make_node(nx, ny, p.z));            }        }        if (mp[p.z][p.x][p.y] == 'U'&&p.z + 1<n&&mp[p.z + 1][p.x][p.y] != 'x'&&d[p.z + 1][p.x][p.y] == -1){            d[p.z + 1][p.x][p.y] = d[p.z][p.x][p.y] + 1;            que.push(make_node(p.x, p.y, p.z + 1));        }        if (mp[p.z][p.x][p.y] == 'D'&&p.z - 1 >= 0 && mp[p.z - 1][p.x][p.y] != 'x'&&d[p.z - 1][p.x][p.y] == -1){            d[p.z - 1][p.x][p.y] = d[p.z][p.x][p.y] + 1;            que.push(make_node(p.x, p.y, p.z - 1));        }    }    return d[en.z][en.x][en.y];}int main(){    while (~scanf("%d%d%d", &n, &l, &r))    {        for (int i = 0; i<n; i++)            for (int j = 0; j<l; j++)                for (int k = 0; k<r; k++){                    scanf("%c", &mp[i][j][k]);                    if (mp[i][j][k] == 'X')                    {                        st.z = i; st.x = j; st.y = k;                    }                    if (mp[i][j][k] == 'Y')                    {                        en.z = i; en.x = j; en.y = k;                    }                }        int ans = bfs();        printf("%d\n", ans);    }}
0 0
原创粉丝点击