思路:这是一个三维迷宫问题,用六个方向数组搞定的,注意剪枝!代码如下:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
char map[30][30][30];
//int vis[30][30][30];
int L,R,C;
struct node{
int x;
int y;
int z;
int t;
bool friend operator < (node a,node b)
{
return a.t > b.t;
}
};
int dis[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
void BFS(int x,int y,int z,int x1,int y1,int z1){
int vis[30][30][30]={0};
priority_queue<node>que;
node e1,e2;
e1.x=x,e1.y=y,e1.z=z,e1.t=0;
que.push(e1);
vis[e1.x][e1.y][e1.z]=1;
int ans=-1;
while(!que.empty()){
e1=que.top();
que.pop();
if(e1.x==x1&&e1.y==y1&&e1.z==z1){
ans=e1.t;
break;
}
for(int i=0;i<6;i++){
e2.x=e1.x+dis[i][0];
e2.y=e1.y+dis[i][1];
e2.z=e1.z+dis[i][2];
if(map[e2.x][e2.y][e2.z]!='#' && 0<=e2.x && e2.x<L && 0<=e2.y && e2.y<R && 0<=e2.z && e2.z<C&&!vis[e2.x][e2.y][e2.z])
{
e2.t=e1.t+1;
que.push(e2);
vis[e2.x][e2.y][e2.z]=1;
}
}
}
if(ans==-1)
cout<<"Trapped!"<<endl;
else
printf("Escaped in %d minute(s).\n",ans);
}
int main()
{
int x1,x2,y1,y2,z1,z2;
while(cin>>L>>R>>C&&L&&R&&C){
for(int i=0;i<L;i++){
for(int j=0;j<R;j++){
for(int p=0;p<C;p++){
cin>>map[i][j][p];
if(map[i][j][p]=='S')
{
x1=i;
y1=j;
z1=p;
}
if(map[i][j][p]=='E')
{
x2=i;
y2=j;
z2=p;
}
}
}
}
BFS(x1,y1,z1,x2,y2,z2);
}
return 0;
}
ps:风景虽美,记忆残存!
Description - 题目描述
[NWUACM]
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?
Input - 输入
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度。
R和C分别表示每层空间的行与列的大小。
随后L层地牢,每层R行,每行C个字符。
每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
每层空间后都有一个空行。L,R和C均为0时输入结束。
Output - 输出
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
Sample Input - 输入样例
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output - 输出样例
Escaped in 11 minute(s). Trapped!