POJ 2251 Dungeon Master (三维BFS)

题目链接

poj2251

题目大意

给定一个三维的地图,‘#’不能走,‘.’能走,求起到S到终点E的最短路。

分析

这题就是一道求迷宫中的最短路的题,只不过迷宫是三维的,方向数组由原来的4个方向变成了6个方向。直接BFS求距离即可。
PS:虽说是道简单题,但我还是WA了好几次QAQ,原因是我一开始判断格子是否能走的布尔函数是这样写的:

bool can(int x,int y,int z)
{
    if ((maze[x][y][z]=='.'||maze[x][y][z]=='E')&&(!vis[x][y][z]))
        return true;
    return false;
}

这样看似把扩展范围限定在界内了,但因为题目是多组数组的,而我每一次迷宫的字符数组是不清空,当新输入的迷宫比旧迷宫尺寸小时,旧迷宫多出来的部分仍然存在,我这个判断函数会导致扩展出界。因此,这种题目的判断函数还是老老实实把不服和的情况都列出来为好。

代码

#include <iostream>
#include <cstring>
#include <queue>
#define MAXN 35
using namespace std;
struct Node
{
    int x,y,z,step;
}s;
char maze[MAXN][MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN];
int ans,l,r,c;
bool can(int x,int y,int z)
{
    if (x<1||x>r||y<1||y>c||z<1||z>l) //判断是否出界
        return false;
    if (maze[x][y][z]=='#')  //判断是否是障碍物
        return false;
    if (vis[x][y][z])        //判断是否访问过
        return false;
    return true;
}
bool can(int x,int y,int z)
{
    if 
}
bool Bfs()
{
    queue<Node> Q;
    int d[6][3]={{0,0,1},{0,0,-1},{0,-1,0},{0,1,0},{-1,0,0},{1,0,0}};
    memset(vis,false,sizeof(vis));
    vis[s.x][s.y][s.z]=true;
    while (!Q.empty())
        Q.pop();
    Q.push(s);
    while (!Q.empty())
    {
        Node temp=Q.front();
        Q.pop();
        if (maze[temp.x][temp.y][temp.z]=='E')
        {
            ans=temp.step;
            return true;
        }
        for (int i=0;i<=5;i++)
        {
            Node temp2;
            temp2.x=temp.x+d[i][0];
            temp2.y=temp.y+d[i][1];
            temp2.z=temp.z+d[i][2];
            if (can(temp2.x,temp2.y,temp2.z))
            {
                temp2.step=temp.step+1;
                vis[temp2.x][temp2.y][temp2.z]=true;
                Q.push(temp2);
            }
        }
    }
    return false;
}
int main()
{
    int i,j,k;
    while (cin>>l>>r>>c)
    {
        if (!l&&!r&&!c) break;
        for (k=1;k<=l;k++)
            for (i=1;i<=r;i++)
                for (j=1;j<=c;j++)
                {
                    cin>>maze[i][j][k];
                    if (maze[i][j][k]=='S')
                    {
                        s.x=i;s.y=j;s.z=k;
                        s.step=0;
                    }
                }
        if (Bfs())
            cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
        else
            cout<<"Trapped!"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值