说说:
其实这道题就是一道广度优先遍历求最短路径的简单题目。但是可能今晚状态不太好,开始一直想当然地就按深度优先遍历去写了。然后测试数据又刚好能通过,结果就特别地纠结。不过总的来说,这道题是非常简单的。至于代码的话,后来写得烦起来了,可能看起来有点凌乱QAQ
源代码:
#include <stdio.h>
#include <string.h>
#define MAX 30+5
typedef struct{
int x;
int y;
int z;
int dis;
}NODE;
NODE queue[28000];//队列
char dungeon[MAX][MAX][MAX];
int vis[MAX][MAX][MAX];//记录最短路径
int L,R,C,ans;
int ex,ey,ez;
int head,tail;
void bfs();
void inqueue(int,int,int);//将某个节点入队
int main(){
int i,j,k;
// freopen("data","r",stdin);
while(scanf("%d%d%d",&L,&R,&C)){
if(!L&&!R&&!C)
break;
memset(vis,0,sizeof(vis));
tail=head=ans=0;
for(i=0;i<L;i++)
for(j=0;j<R;j++)
scanf("%s",dungeon[i][j]);
for(i=0;i<L;i++)
for(j=0;j<R;j++)
for(k=0;k<C;k++)
if(dungeon[i][j][k]=='E'){//找到出口
ex=i;
ey=j;
ez=k;
}
for(i=0;i<L;i++)
for(j=0;j<R;j++)
for(k=0;k<C;k++)
if(dungeon[i][j][k]=='S'){
vis[i][j][k]=1;
queue[tail].x=i;
queue[tail].y=j;
queue[tail].z=k;
queue[tail].dis=1;
tail++;
while(head<tail)
bfs();
}
if(ans)
printf("Escaped in %d minute(s).\n",vis[ex][ey][ez]-1);
else
printf("Trapped!\n");
}
return 0;
}
void bfs(){
int x,y,z;
x=queue[head].x;
y=queue[head].y;
z=queue[head].z;
if(x==ex&&y==ey&&z==ez)
ans=1;
if(z-1>=0&&dungeon[x][y][z-1]!='#'&&!vis[x][y][z-1])//注意边界条件,较为繁琐
inqueue(x,y,z-1);
if(z+1<C&&dungeon[x][y][z+1]!='#'&&!vis[x][y][z+1])
inqueue(x,y,z+1);
if(y-1>=0&&dungeon[x][y-1][z]!='#'&&!vis[x][y-1][z])
inqueue(x,y-1,z);
if(y+1<R&&dungeon[x][y+1][z]!='#'&&!vis[x][y+1][z])
inqueue(x,y+1,z);
if(x-1>=0&&dungeon[x-1][y][z]!='#'&&!vis[x-1][y][z])
inqueue(x-1,y,z);
if(x+1<L&&dungeon[x+1][y][z]!='#'&&!vis[x+1][y][z])
inqueue(x+1,y,z);
head++;
return;
}
void inqueue(int x,int y,int z){
queue[tail].x=x;
queue[tail].y=y;
queue[tail].z=z;
queue[tail].dis=vis[x][y][z]=queue[head].dis+1;
tail++;
}Dungeon Master UVA 532 (三维空间的广度优先遍历)
原文地址:http://blog.csdn.net/u011915301/article/details/39273009