B - Xiper的奇妙歷險(2)

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 2
XY
1
2 2 2
YU
..
XD
xx

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章