Dungeon Master POJ - 2251(结构体压入queue+三维dfs)

https://vjudge.net/problem/POJ-2251
Dungeon Master POJ - 2251
一个裸的三维bfs,其实和二维差不了多少


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
using namespace std;
int n1,n2,n3;
int visit[40][40][40];
char a[40][40][40];
int nextt[6][3]= {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
    int x,y,z,step;
};
int go(int x,int y,int z)
{    //判断下一个是否超出图的边界
    if(0<=x&&x<n1&&0<=y&&y<n2&&0<=z&&z<n3&&a[x][y][z]=='.')
        return 1;
    return 0;
}
int bfs(node s1,node s2)
{
    queue<node>q;  //直接
    node st,ed;  //st记录现在的,ed记录下一个
    st.x=s1.x;
    st.y=s1.y;
    st.z=s1.z;
    st.step=0;
    memset(visit,0,sizeof(visit));
    visit[st.x][st.y][st.z]=1;
    a[s2.x][s2.y][s2.z]='.'; //因为要遍历到这个出口点,所以把它设为'.',
    q.push(st);         //比较方便,后面不有单独if了
    while(!q.empty())
    {
        st=q.front();  //拿出队列第一个
        q.pop();  //弹出队列第一个
        if(st.x==s2.x&&st.y==s2.y&&st.z==s2.z)
            return st.step;  //因为是找最短的
              //bfs,最先遍历到,就是最短的,所以直接输出
              //比dfs简单
        for(int i=0; i<6; i++)
        {
            ed.x=st.x+nextt[i][0];
            ed.y=st.y+nextt[i][1];
            ed.z=st.z+nextt[i][2];
            if(!visit[ed.x][ed.y][ed.z]&&go(ed.x,ed.y,ed.z))
            {
                ed.step=st.step+1;   //等于上一步加1
                visit[ed.x][ed.y][ed.z]=1;
                q.push(ed);  //入列
            }
        }
    }
    return -1;  //找不到就返回-1
}
int main()
{
    while(scanf("%d%d%d",&n1,&n2,&n3),n1||n2||n3)
    {
        node st,en;
        for(int i=0; i<n1; i++)
        {
            getchar();
            for(int j=0; j<n2; j++)
            {
                scanf("%s",a[i][j]);
            }
        }
        for(int i=0; i<n1; i++)
        {
            for(int j=0; j<n2; j++)
            {
                for(int k=0; k<n3; k++)
                {
                    if(a[i][j][k]=='S')  //记录开始的
                    {                   //点
                        st.x=i,st.y=j,st.z=k;
                    }
                    else if(a[i][j][k]=='E')
                    {                 //记录结束的点
                        en.x=i,en.y=j,en.z=k;
                    }
                }
            }
        }
        int ans=bfs(st,en);
        if(ans==-1)printf("Trapped!\n");
        else printf("Escaped in %d minute(s).\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值