Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
作为一个弱菜,被这道题卡了一天了。
三维广搜,六个方向,上下左右前后。
第一个案例可以理解为三个三层叠在一起的。
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define M 45
#define inf 0x6ffffff
char map[M][M][M];
int vis[M][M][M];
int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//六个方向
int n,m,ok,k;
struct node
{
int x,y,z;
int time;
}
;
node f[666];
int ztime;
int z2,x2,y2,z1,x1,y1;
void bfs()
{
int i;
queue<node>q;
node st,ed;
st.x=x1;
st.y=y1;
st.z=z1;
st.time=0;
q.push(st);
while(!q.empty())
{
st=q.front();
q.pop();
if(st.x==x2 &&st.y==y2 &&st.z==z2)
{
ok=1;
ztime=st.time;
return;
}
for(i=0;i<6;i++)
{
ed.x=st.x+dir[i][0];
ed.y=st.y+dir[i][1];
ed.z=st.z+dir[i][2];
if(map[ed.x][ed.y][ed.z]=='#' ||vis[ed.x][ed.y][ed.z] ||ed.x<0 ||ed.x>=k ||ed.y<0 ||ed.y>=n ||ed.z<0||ed.z>=m)//越界,搜过的地方,墙全部排除
continue;
ed.time=st.time+1; //时间加一
vis[ed.x][ed.y][ed.z]=1;
q.push(ed);
}
}
return;
}
int main()
{
int i,j,r;
while(scanf("%d%d%d",&k,&n,&m)!=EOF &&k!=0 &&n!=0 &&m!=0)
{
ok=0;
memset(vis,0,sizeof(vis));
for(i=0;i<k;i++)
for(j=0;j<n;j++) //我把j++写成i++找了一天的错误。。无语。
{
scanf("%s",map[i][j]);//输入地图
for(r=0;r<m;r++)
{
if(map[i][j][r]=='S')
{
z1=r;
x1=i;
y1=j;
}
else if(map[i][j][r]=='E')
{
z2=r;
x2=i;
y2=j;
}
}
}
vis[x1][y1][z1]=1;
bfs();
// printf("%d\n",ok);
if(!ok)
printf("Trapped!\n"); //后面有!。这里WA了一次。
else
printf("Escaped in %d minute(s).\n",ztime);//改了上面之后,这里后面有个点,又WA了一次。 ORZ。
}
return 0;
}
原文:http://blog.csdn.net/sky_miange/article/details/43491359