poj2251 Dungeon Master bfs

题目链接:http://poj.org/problem?id=2251

题目大意: 

给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径

移动方向可以是上,下,左,右,前,后,六个方向

每移动一次就耗费一分钟,要求输出最快的走出时间。

不同L层的地图,相同RC坐标处是连通的

 

简单的bfs

///2014.3.30 - 2014.4.2
///poj2251

#include <iostream>
#include <cstdio>
using namespace std;

int L,R,C;
char maze[40][40][40];
bool visted[40][40][40];
struct position
{
    char l,r,c;  ///由于l,r,c均小于40,这里把char当作单字节整数用
    int step;
};
position s,e;

int addR[6] = {-1,0,1,0,0,0};
int addC[6] = {0,-1,0,1,0,0};
int addL[6] = {0,0,0,0,1,-1};

void init(){
    char temp;
    for(int i=1 ; i<=L ; i++){
        for(int j=1 ; j<=R ; j++){
            for(int k=1 ; k<=C ; k++){
                cin>>temp;
                if( temp == 'S' ){
                    s.l=i , s.r=j , s.c=k ,s.step=0 ;
                }
                if( temp == 'E' ){
                    temp = '.';
                    e.l=i , e.r=j , e.c=k ,e.step=-1;
                }
                maze[i][j][k] = temp;
                visted[i][j][k] = false;
            }
        }
    }
}

int bfs(position pos){
    position queue[30000];
    int head,tail;
    queue[0] = pos;
    queue[0].step = 0;
    visted[pos.l][pos.r][pos.c] = true;
    head = 0;
    tail = 1;

    bool find = false;
    while( head<tail && !find ){
        for(int i=0 ; i<6 ; i++){
            if( queue[head].l+addL[i]>=1 && queue[head].l+addL[i]<=L &&
                    queue[head].r+addR[i]>=1 && queue[head].r+addR[i]<=R &&
                    queue[head].c+addC[i]>=1 && queue[head].c+addC[i]<=C &&
                    !visted[ queue[head].l+addL[i] ][ queue[head].r+addR[i] ][ queue[head].c+addC[i] ] && 
                    maze[ queue[head].l+addL[i] ][ queue[head].r+addR[i] ][ queue[head].c+addC[i] ]=='.' ){
                queue[tail].l = queue[head].l + addL[i];
                queue[tail].r = queue[head].r + addR[i];
                queue[tail].c = queue[head].c + addC[i];
                queue[tail].step = queue[head].step + 1;
                visted[ queue[tail].l ][ queue[tail].r ][ queue[tail].c ] = true;
                if( queue[tail].l==e.l && queue[tail].r==e.r && queue[tail].c==e.c ){
                    find = true;
                    break;
                }
                tail++;
            }
        }
        head++;
    }
    
    if( find ){
        return queue[tail].step;
    }
    else
        return -1;
}

int main()
{
    // freopen("in","r",stdin);
    // freopen("out","w",stdout);

    while( cin>>L>>R>>C && L && R && C ){
        init();

        int time = bfs(s);
        if( time==-1 )
            cout<<"Trapped!"<<endl;
        else
            cout<<"Escaped in "<<time<<" minute(s)."<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值