您的位置:首页 > 其它

POJ 2251 Dungeon Master (三维BFS)

2017-02-08 18:27 357 查看

题目链接

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息