说说:
其实这道题就是一道广度优先遍历求最短路径的简单题目。但是可能今晚状态不太好,开始一直想当然地就按深度优先遍历去写了。然后测试数据又刚好能通过,结果就特别地纠结。不过总的来说,这道题是非常简单的。至于代码的话,后来写得烦起来了,可能看起来有点凌乱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