POJ 2251-Dungeon Master (三維BFS)
阿新 • • 發佈:2018-11-10
分析
三維BFS即可,只能上下東西南北6個方向走。
注意不只是‘.’可以走‘E’也可以,就是保證不越界的情況下除了‘#’都可以走
vis忘memset wa了一發。
AC Code
#include<iostream> #include<cstdio> #include<queue> typedef long long ll; const int INF=0x3f3f3f3f; const int maxn=30+5; using namespace std; int l,r,c; int sz,sx,sy; int dz[]={0,0,0,0,1,-1},dx[]={1,-1,0,0,0,0},dy[]={0,0,1,-1,0,0}; char mp[maxn][maxn][maxn]; bool vis[maxn][maxn][maxn]; struct node{ int x,y,z,level; }; bool judge(node &tar){ if(mp[tar.z][tar.x][tar.y]=='E') return 1; return 0; } bool ise(node &tar){ if(tar.z>=0&&tar.z<l&&tar.x>=0&&tar.x<r&&tar.y>=0&&tar.y<c) return 1; return 0; } int bfs(){ queue<node> q; node cur,next; cur.z=sz; cur.x=sx; cur.y=sy; cur.level=0; memset(vis,0,sizeof(vis)); vis[cur.z][cur.x][cur.y]=1; q.push(cur); while(!q.empty()){ cur=q.front(); q.pop(); for(int i=0;i<6;i++){ next.z=cur.z+dz[i]; next.x=cur.x+dx[i]; next.y=cur.y+dy[i]; if(ise(next)&&mp[next.z][next.x][next.y]!='#'&&!vis[next.z][next.x][next.y]){ next.level=cur.level+1; vis[next.z][next.x][next.y]=1; q.push(next); } if(judge(next)){ return next.level; } } } return -1; } int main(){ while(~scanf("%d%d%d",&l,&r,&c)&&l+r+c){ for(int i=0;i<l;i++){ for(int j=0;j<r;j++){ scanf("%s",mp[i][j]); for(int k=0;k<c;k++){ if(mp[i][j][k]=='S'){ sz=i;sx=j;sy=k; } } } } int ans=bfs(); if(ans==-1)printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",ans); } return 0; }