1. 题意:有一个3维地牢,目前所处位置是‘S’,要想逃生,可以往东西南北上下六个方向走,‘#’代表不能通过,‘。’代表可以通过,求逃离到出口‘E’最短时间,走一步一分钟。
2. 思路:bfs简单搜素,注意三维空间处理,方向可处理为:int dir[6][3]= {{0,0,1},{0,-1,0},{1,0,0},{0,0,-1},{0,1,0},{-1,0,0}};
3. 注意:1.加入点时,要加入出口‘E’;
2.注意数组大小
4.代码:
#include<stdio.h> #include<string.h> char map[35][35][35]; int sx,sy,sz,ex,ey,ez; int dir[6][3]= {{0,0,1},{0,-1,0},{1,0,0},{0,0,-1},{0,1,0},{-1,0,0}}; int visit[100][100][100]; struct node { int x; int y; int z; int step; } a[30000];//数组大小,最大点的个数 int bfs(int l,int r,int c) { int front=0; int rear=1; a[0].x=sx; a[0].y=sy; a[0].z=sz; a[0].step=0; node cur,change; while(front<rear) { cur=a[front++]; //printf("%d%d%d\n",cur.x,cur.y,cur.z); if(cur.x==ex&&cur.y==ey&&cur.z==ez) return cur.step; for(int i=0; i<6; i++) { int tx=cur.x+dir[i][0]; int ty=cur.y+dir[i][1]; int tz=cur.z+dir[i][2]; if(tx>=0&&tx<l&&ty>=0&&ty<r&&tz>=0&&tz<c&&visit[tx][ty][tz]==0&&(map[tx][ty][tz]=='.'||map[tx][ty][tz]=='E'))//注:加入E点 { visit[tx][ty][tz]=1; change.x=tx; change.y=ty; change.z=tz; change.step=cur.step+1; a[rear++]=change; } } } return -1; } int main() { int l,r,c; while(scanf("%d%d%d",&l,&r,&c)!=EOF) { memset(visit,0,sizeof(visit)); if(l==0&&r==0&&c==0) break; for(int i=0; i<l; i++) { for(int j=0; j<r; j++) { scanf("%s",map[i][j]); //printf("%s\n",map[i][j]); for(int k=0; k<c; k++) { if(map[i][j][k]=='S') { sx=i; sy=j; sz=k; } if(map[i][j][k]=='E') { ex=i; ey=j; ez=k; } } } } int ans=bfs(l,r,c); if(ans==-1) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",ans); } return 0; }