题目链接:http://poj.org/problem?id=2251
题目大意:
给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径
移动方向可以是上,下,左,右,前,后,六个方向
每移动一次就耗费一分钟,要求输出最快的走出时间。
不同L层的地图,相同RC坐标处是连通的;
解题思路:其实就是多了两个方向,map数组开诚三维的就行了;
代码:
#include <iostream>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;
struct node
{
int x,y,z;
int time;
};
int sx,sy,sz;
char map[35][35][35];
int vis[35][35][35];
int dis[6][3]={{0,1,0},{0,-1,0},{-1,0,0},{1,0,0},{0,0,1},{0,0,-1}};
int l,r,c;
bool judge(node p)
{
if(p.x<0||p.y<0||p.z<0||p.x>=l||p.y>=r||p.z>=c||map[p.x][p.y][p.z]=='#'||vis[p.x][p.y][p.z])
{
return 0;
}
return 1;
}
void bfs()
{
node p,temp;
queue<node>q;
p.x=sx;
p.y=sy;
p.z=sz;
p.time=0;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
for(int i=0;i<6;i++)
{
temp=p;
temp.x+=dis[i][0];
temp.y+=dis[i][1];
temp.z+=dis[i][2];
temp.time=p.time+1;
if(!judge(temp))
continue;
if(map[temp.x][temp.y][temp.z]=='E')
{
printf("Escaped in %d minute(s).\n",temp.time);
return;
}
vis[temp.x][temp.y][temp.z]=1;
q.push(temp);
}
}
printf("Trapped!\n");
}
int main()
{
while(cin>>l>>r>>c)
{
if(l==0&&r==0&&r==0)
break;
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
for(int k=0;k<c;k++)
{
cin>>map[i][j][k];
if(map[i][j][k]=='S')
{
sx=i;
sy=j;
sz=k;
}
}
}
}
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}