您的位置:首页 > 编程语言 > C语言/C++

【poj 2251】 Dungeon Master 题意&题解&代码(C++)

2016-03-22 22:04 681 查看
题目链接:

http://poj.org/problem?id=2251

题意:

题目大意:这题是一个三维的迷宫题目,其中用’.’表示空地,’#’表示障碍物,’S’表示起点,’E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。

题解:

恶心的bfs搜最短路,从二位平面拓展到三维立体,其实也只需要把原本的二位方向数组改为三维即可。。。

代码:

迷之wa

nclude<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char c[35];
int flag,opx,opy,oph,edx,edy,edh,n,m,h,f[35][35][35],dis[35][35][35];
struct node{
int x;int y;int z;
};
int de[3][6]={{1,-1,0, 0,0, 0},
{0, 0,1,-1,0, 0},
{0, 0,0, 0,1,-1}};
queue<node>q;
void bfs()
{
node st;
flag=0;
st.x=opx;st.y=opy;st.z=oph;
q.push(st);
dis[oph][opx][opy]=0;
while(!q.empty() && flag==0)
{
node now=q.front();q.pop();
int nox=now.x;
int noy=now.y;
int noz=now.z;
for (int i=0;i<6;i++)
{
int nex=nox+de[0][i];
int ney=noy+de[1][i];
int nez=noz+de[2][i];
if (nex>=1 && nex<=m && ney>=1 && ney<=n && nez>=1 && nez<=h)
{
if (dis[nez][nex][ney]==-1&&f[nez][nex][ney]==0)
{
node ne;
ne.x=nex;ne.y=ney;ne.z=nez;
dis[nez][nex][ney]=dis[noz][nox][noy]+1;
q.push(ne);
}
}
if (edx==nex && edy==ney && edh==nez)
{
flag=1;return ;
}
}
}
}
int main()
{
while(scanf("%d%d%d",&h,&n,&m))
{
if (n==0&&m==0&&h==0)   return 0;
memset(dis,-1,sizeof(dis));
while(!q.empty()) q.pop();
for (int k=1;k<=h;k++)
for (int i=1;i<=n;i++)
{
scanf("%s",c);
for (int j=1;j<=m;j++)
{
if (c[j-1]=='S')
opx=j,opy=i,oph=k;
else if (c[j-1]=='#')
f[k][j][i]=1;
else if (c[j-1]=='E')
edx=j,edy=i,edh=k;
}
}
bfs();
if (flag) printf("Escaped in %d minute(s).\n",dis[edh][edx][edy]);
else printf("Trapped!\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: