[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!
解法:
广搜模板题,只是把2维变成了3维,每次操作循环6次即可
附 Time Limit Exceeded 代码
原因:使用结构体中int变量做多次比较不如直接使用int变量比较迅速
#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
int L,R,C,vst[35][35][35];
int dis[6][3]={{0,0,1},{0,0,-1},{1,0,0},{-1,0,0},{0,1,0},{0,-1,0}};
char s[35][35][35];
struct point
{
int x,y,z,time;
}p;
void bfs(point xx)
{
point now,next;
queue<point> q;
vst[xx.z][xx.x][xx.y]=1;
q.push(xx);
while(!q.empty())
{
now=q.front();
q.pop();
if(s[now.z][now.x][now.y]=='E')
{
printf("Escaped in %d minute(s).\n",now.time);
return;
}
for(int i=0;i<6;i++)
{
next.x=now.x+dis[i][0];
next.y=now.y+dis[i][1];
next.z=now.z+dis[i][2];
if(next.x<0||next.y<0||next.z<0||next.x>=R||next.y>=C||next.z>=L)//使用结构体直接比较超时
continue;
if(vst[next.z][next.x][next.y]==0&&s[next.z][next.x][next.y]!='#')
{
next.time=now.time+1;
vst[now.z][now.x][now.y]=1;
q.push(next);
}
}
}
printf("Trapped!\n");
return;
}
int main()
{
while(~scanf("%d %d %d",&L,&R,&C))
{
if(L==0&&R==0&&C==0)
{
break;
}
memset(vst,0,sizeof(vst));
point start;
for(int i=0;i<L;i++)
{
for(int j=0;j<R;j++)
{
scanf("%s",s[i][j]);
for(int l=0;l<C;l++)
{
if(s[i][j][l]=='S')
{
start.x=j;
start.y=l;
start.z=i;
start.time=0;
}
}
}
}
bfs(start);
}
return 0;
}
AC代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
int L,R,C,vst[35][35][35],x1,y1,z1,t;
int dis[6][3]={{0,0,1},{0,0,-1},{1,0,0},{-1,0,0},{0,1,0},{0,-1,0}};
char s[35][35][35];
struct point
{
int x,y,z,time;
}p;
void bfs(point xx)
{
point now,next;
queue<point> q;
vst[xx.z][xx.x][xx.y]=1;
q.push(xx);
while(!q.empty())
{
now=q.front();
q.pop();
x1=now.x;
y1=now.y;
z1=now.z;
t=now.time;
if(s[z1][x1][y1]=='E')
{
printf("Escaped in %d minute(s).\n",now.time);
return;
}
for(int i=0;i<6;i++)
{
int x2=next.x=x1+dis[i][0];
int y2=next.y=y1+dis[i][1];
int z2=next.z=z1+dis[i][2];
next.time=t+1;
if(x2<0||y2<0||z2<0||x2>=R||y2>=C||z2>=L)
continue;
if(vst[z2][x2][y2]==0&&s[z2][x2][y2]!='#')
{
vst[z2][x2][y2]=1;
q.push(next);
}
}
}
printf("Trapped!\n");
return;
}
int main()
{
while(~scanf("%d %d %d",&L,&R,&C))
{
if(L==0&&R==0&&C==0)
{
break;
}
memset(vst,0,sizeof(vst));
point start;
for(int i=0;i<L;i++)
{
for(int j=0;j<R;j++)
{
scanf("%s",s[i][j]);
for(int l=0;l<C;l++)
{
if(s[i][j][l]=='S')
{
start.x=j;
start.y=l;
start.z=i;
start.time=0;
}
}
}
}
bfs(start);
}
return 0;
}