POJ-2251 Dungeon Master (BFS+優先隊列)

這題是今年4月我們校隊選拔時的最後一題,當時用的是一樣的方法怎麼做卻都是WA,最後也沒做出來;時隔3個月再做一遍才AC,也算填上了一個坑。。。orz

POJ-2251 Dungeon Master

Description

你被困在一個三維的空間中,現在要尋找最短路徑逃生!
空間由立方體單位構成
你每次向上下前後左右移動一個單位需要一分鐘
你不能對角線移動並且四周封閉
是否存在逃出生天的可能性?如果存在,則需要多少時間?

Input

輸入第一行是一個數表示空間的數量。
  每個空間的描述的第一行爲L,R和C(皆不超過30)。
  L表示空間的高度。
  R和C分別表示每層空間的行與列的大小。
  隨後L層地牢,每層R行,每行C個字符。
  每個字符表示空間的一個單元。’#‘表示不可通過單元,’.‘表示空白單元。你的起始位置在’S’,出 口爲’E’。
  每層空間後都有一個空行。L,R和C均爲0時輸入結束。

Output

每個迷宮對應一行輸出。
如果可以逃生,則輸出如下
Escaped in x minute(s).
x爲最短脫離時間。
如果無法逃生,則輸出如下
Trapped!

Sample Input

3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

Sample Output

Escaped in 11 minute(s).
Trapped!




思路:BFS模板題,沒什麼好講的

AC代碼:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;

char t[32][32][32];
int vis[32][32][32];
int dir[6][3] = {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}}; //移動的六個方向
int sl,sr,sc,er,ec,el;

struct node{
   int l,r,c,cnt;
};

int l,r,c;

//檢查是否越界或者撞到牆壁,如果沒有則返回true
bool nex_lim(int ll,int rr,int cc)
{
    if(ll<0||ll>=l||rr<0||rr>=r||cc<0||cc>=c||t[ll][rr][cc] == '#')
        return false;
    else
        return true;
}

int bfs(queue<node> &q)
{
    while(!q.empty()){
        node f = q.front();
        int fl = f.l, fr = f.r, fc = f.c, ft = f.cnt;
        for(int i=0;i<6;i++)
            if(nex_lim(fl+dir[i][0],fr+dir[i][1],fc+dir[i][2]) && !vis[fl+dir[i][0]][fr+dir[i][1]][fc+dir[i][2]])
            {
                if(fl+dir[i][0]==el && fr+dir[i][1]== er && fc+dir[i][2] == ec)
                    return ft+1;
                node temp = {fl+dir[i][0],fr+dir[i][1],fc+dir[i][2],ft+1};
                vis[fl+dir[i][0]][fr+dir[i][1]][fc+dir[i][2]] = 1; //訪問過的點不要忘記標成vis1
                q.push(temp);
            }
        q.pop();
    }
    return -1;
}

int main()
{
    scanf("%d %d %d",&l,&r,&c); getchar();
    while(l){
        memset(vis,0,sizeof vis);
        
        for (int i=0;i<l;i++)
        {
            for(int j=0;j<r;j++)
            {
                for(int k=0;k<c;k++)
                {

                    t[i][j][k] = getchar();
                    if(t[i][j][k]=='S')
                    {
                        sl = i; sr = j; sc = k;
                    }
                    else if(t[i][j][k]=='E')
                    {
                        el = i; er = j; ec = k;
                    }
                }
                getchar();
            }
            getchar();
        }
        queue<node> q;
        node temp = {sl,sr,sc,0};
        q.push(temp); //因爲queue沒有clear方法,所以聲明爲內部變量而不是全局變量
        vis[sl][sr][sc] = 1;
        int a = bfs(q);
        if(a!=-1) cout << "Escaped in " <<a << " minute(s)." << endl;
        else puts("Trapped!");
        scanf("%d %d %d",&l,&r,&c); getchar();
    }

   return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章