您的位置:首页 > 其它

【POJ】2251-Dungeon Master BFS、三维迷宫

2018-02-27 21:13 459 查看
http://poj.org/problem?id=2251

从S点到E点最近的距离,不过是三位。

三维迷宫需要六个方向,并且在坐标处理上不用复杂化。

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

const int maxn=100;

string G[maxn][maxn];
bool vis[maxn][maxn][maxn];
int h,n,m;
int dx[6]={0,0,0,0,1,-1};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={1,-1,0,0,0,0};

struct Node{
int x,y,z;
int t;
};
Node Begin,End;

int BFS(){
queue <Node> q;
q.push(Begin);
while (!q.empty()){
Node Now=q.front();
q.pop();
if (Now.x==End.x&&Now.y==End.y&&Now.z==End.z){
return Now.t;
}
for (int i=0;i<6;i++){
Node Tmp;
Tmp.x=Now.x+dx[i];
Tmp.y=Now.y+dy[i];
Tmp.z=Now.z+dz[i];
Tmp.t=Now.t+1;
if (Tmp.x>=0&&Tmp.x<h&&Tmp.y>=0&&Tmp.y<n&&Tmp.z>=0&&Tmp.z<m&&!vis[Tmp.x][Tmp.y][Tmp.z]&&G[Tmp.x][Tmp.y][Tmp.z]!='#'){
vis[Tmp.x][Tmp.y][Tmp.z]=1;
q.push(Tmp);
}
}
}
return -1;
}

int main(){

while (cin >> h >> n >> m){
if (h==0&&n==0&&m==0){
return 0;
}
for
4000
(int i=0;i<h;i++){
for (int j=0;j<n;j++){
cin >> G[i][j];
for (int k=0;k<m;k++){
if (G[i][j][k]=='S'){
Begin.x=i;
Begin.y=j;
Begin.z=k;
Begin.t=0;
}
if (G[i][j][k]=='E'){
End.x=i;
End.y=j;
End.z=k;
End.t=0;
}
}
}
}

memset(vis,false,sizeof(vis));
int ans=BFS();
if (ans==-1){
cout << "Trapped!" << endl;
}
else{
cout << "Escaped in " << ans << " minute(s)." << endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: