首页 > 代码库 > poj 2251 Dungeon Master(bfs)

poj 2251 Dungeon Master(bfs)

链接:poj 2251

题意:这题从二维空间扩展到三维空间了,可以上下左右前后移动,每次都只能移到相邻的空位,

      每次需要花费一分钟,求从起点到终点最少要多久

      #表示岩石,.表示空位,S是起点,E是终点

这题只需要从6个方向bfs是行了,开始一直超时,改成dfs就wa,

之后发现每次访问后应立即标记为已访问、、、我是通过将访问的点变成#即岩石,来标记已访问的

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct stu
{
    int i,j,k;
};
char s[35][35][35];
int m,n,p;
int bfs(struct stu a,struct stu b)
{
    int i,j,k,t[35][35][35]={0};
    queue<struct stu> q;
    q.push(a);
    s[a.i][a.j][a.k]='#';
    while(!q.empty()){
        a=q.front();
        q.pop();
        i=a.i;
        j=a.j;
        k=a.k;
        if(i==b.i&&j==b.j&&k==b.k)               //到达终点结束
            return t[i][j][k];
        if(i>0&&s[i-1][j][k]!='#'){               
            a.i=i-1;
            a.j=j;
            a.k=k;
            q.push(a);
            t[i-1][j][k]=t[i][j][k]+1;          //计算时间
            s[i-1][j][k]='#';                  //记得访问后要立即标记
        }
        if(i<m-1&&s[i+1][j][k]!='#'){
            a.i=i+1;
            a.j=j;
            a.k=k;
            q.push(a);
            t[i+1][j][k]=t[i][j][k]+1;
            s[i+1][j][k]='#';
        }
        if(j>0&&s[i][j-1][k]!='#'){
            a.i=i;
            a.j=j-1;
            a.k=k;
            q.push(a);
            t[i][j-1][k]=t[i][j][k]+1;
            s[i][j-1][k]='#';
        }
        if(j<n-1&&s[i][j+1][k]!='#'){
            a.i=i;
            a.j=j+1;
            a.k=k;
            q.push(a);
            t[i][j+1][k]=t[i][j][k]+1;
            s[i][j+1][k]='#';
        }
        if(k>0&&s[i][j][k-1]!='#'){
            a.i=i;
            a.j=j;
            a.k=k-1;
            q.push(a);
            t[i][j][k-1]=t[i][j][k]+1;
            s[i][j][k-1]='#';
        }
        if(k<p-1&&s[i][j][k+1]!='#'){
            a.i=i;
            a.j=j;
            a.k=k+1;
            q.push(a);
            t[i][j][k+1]=t[i][j][k]+1;
            s[i][j][k+1]='#';
        }
    }
    return -1;                      //若不可能到达终点,则返回-1
}
int main()
{
    int i,j,k,sum;
    struct stu x,y;
    while(scanf("%d%d%d",&m,&n,&p)!=EOF){
        getchar();
        if(m==0&&n==0&&p==0)
            break;
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                for(k=0;k<p;k++){
                    scanf("%c",&s[i][j][k]);
                    if(s[i][j][k]=='S'){
                        x.i=i;
                        x.j=j;
                        x.k=k;
                    }
                    else if(s[i][j][k]=='E'){
                        y.i=i;
                        y.j=j;
                        y.k=k;
                    }
                }
                getchar();
            }
            getchar();
        }
        sum=bfs(x,y);
        if(sum!=-1)
            printf("Escaped in %d minute(s).\n",sum);
        else
            printf("Trapped!\n");
    }
    return 0;
}