poj 2251 Dungeon Master

//水题一道,但是鉴于好久没写广搜了,发帖留念。。

//迷宫的三维广搜

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char maze[32][32][32];
int flag[32][32][32], step[32][32][32];
int move[6][3]={{1,0,0}, {-1,0,0}, {0,1,0}, {0,-1,0}, {0,0,1}, {0,0,-1}};
int l, r, c;
struct Point{
    int x, y, z;
}st, end, que[100005];

bool bfs(){
    int front=-1, rear=0;
    Point head, next;
    que[0]=st;
    flag[st.x][st.y][st.z]=1;
    step[st.x][st.y][st.z]=0;
    while(front<rear){
        head=que[++front];
        for(int i=0; i<6; i++){
            next.x=head.x+move[i][0];
            next.y=head.y+move[i][1];
            next.z=head.z+move[i][2];
            if(next.x>=0&&next.x<l&&next.y>=0&&next.y<r&&next.z>=0&&next.z<c){
                step[next.x][next.y][next.z]=step[head.x][head.y][head.z]+1;
                if(next.x==end.x&&next.y==end.y&&next.z==end.z)
                    return true;
                if(!flag[next.x][next.y][next.z]&&maze[next.x][next.y][next.z]=='.'){
                    que[++rear]=next;
                    flag[next.x][next.y][next.z]=1;
                }
            }
        }
    }
    return false;
}

int main(){
    //freopen("1.txt", "r", stdin);
    int i, j, k;
    while(scanf("%d%d%d", &l, &r, &c)&&l){
        memset(flag, 0, sizeof(flag));
        for(i=0; i<l; i++)
            for(j=0; j<r; j++){
                scanf("%s", maze[i][j]);
                for(k=0; k<c; k++){
                    if(maze[i][j][k]=='S'){
                        st.x=i;st.y=j;st.z=k;
                    }
                    else if(maze[i][j][k]=='E'){
                        end.x=i;end.y=j;end.z=k;
                    }
                }
            }
        if(bfs())
            printf("Escaped in %d minute(s).\n", step[end.x][end.y][end.z]);
        else printf("Trapped!\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值