POJ-2251三维bfs

///题意大概讲的就是说 从一个点走到另一个点的最短距离,很巧妙的是这是一个三维的立体平面,其实都一样;
///这个应该就是很土鳖的三维bfs,有坑待填;(细节下面走一波)
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

struct node{int x,y,z,step;};///三个方向,步数;

int dx[6]={-1,1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};///六个方向;
int sx,sy,sz,ex,ey,ez;///记录起始点和终点;
int l,r,c;

char mmp[31][31][31];
bool vis[31][31][31];///记录三维平面下的点的走过的情况

int bfs()
{
    node now,next;///记录当前状态和下一个状态
    queue<node>Q;
    now.x=sx,now.y=sy,now.z=sz,now.step=0;
    vis[sx][sy][sz]=1;
    Q.push(now);///先将最原始的状态进入队列;
    while(!Q.empty())
    {
        now=Q.front(),Q.pop();
        ///拿当前状态队列情况出来搞事情,看当前位置和下一个位置的关系;
        if(now.x==ex&&now.y==ey&&now.z==ez) return now.step;///开车到终点站就要停车了;
        for(int i=0;i<6;i++)
        {
            int x=now.x+dx[i];
            int y=now.y+dy[i];
            int z=now.z+dz[i];
            ///这个是真的被坑惨了 ,原来的写法就直接后面的赋值给next,看了半天才发现了;然后无情的给了我几个WA,美滋滋;
            if(x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<=c&&!vis[x][y][z]&&mmp[x][y][z]!='#')
            {
                vis[x][y][z]=1;
                next.x=x,next.y=y,next.z=z,next.step=now.step+1;
                Q.push(next);///将下一个队列的状态进队;
            }
        }
    }
    return 0;
}

int main()
{
    while(scanf("%d %d %d",&l,&r,&c),l||r||c)
    {
        ///这个输入是真的骚,给的样例中间居然有空格,搞得我土鳖似的一个字符一个字符的输入;
        ///不过后来为scanf("%s",mmp[i][j]);花式过不了;
        getchar();
        for(int i=0;i<l;i++)
        {
            for(int j=0;j<r;j++)
            {
                for(int k=0;k<c;k++)
                {
                    scanf("%c",&mmp[i][j][k]);
                    if(mmp[i][j][k]=='S') {sx=i,sy=j,sz=k;}
                    else if(mmp[i][j][k]=='E') {ex=i,ey=j,ez=k;}
                }
                getchar();
            }
            getchar();
        }
        memset(vis,0,sizeof(vis));
        int ans=bfs();
        if(!ans) 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、付费专栏及课程。

余额充值