题目链接:http://poj.org/problem?id=2251
题意:给出一个地牢,有L层,R行C列,问在S处,能否到达E处?如果能,输出最小步数。
数据范围30,所以直接用了3维数组,模拟六种情况:上北下南左西右东天上地下。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int INF=0x3f3f3f3f; const int maxn=35; int L,R,C; int sl,sx,sy; int el,ex,ey; char map[maxn][maxn][maxn]; bool vis[maxn][maxn][maxn]; bool flag; int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1}; struct node{ int level,x,y; int t; }; bool judge_State(int level,int x,int y){ if(level<0||level>=L||x<0||x>=R||y<0||y>=C) return false; if(map[level][x][y]=='#') return false; if(vis[level][x][y]) return false; return true; } void Bfs(){ memset(vis,0,sizeof(vis)); queue<node>q; node s,tmp; s.level=sl,s.x=sx,s.y=sy,s.t=0; vis[s.level][s.x][s.y]=1; q.push(s); while(!q.empty()){ s=q.front(); q.pop(); if(s.level==el&&s.x==ex&&s.y==ey){ printf("Escaped in %d minute(s).\n",s.t); flag=true; return ; } for(int i=0;i<4;i++){ tmp.level=s.level; tmp.x=s.x+dx[i]; tmp.y=s.y+dy[i]; tmp.t=s.t+1; if(judge_State(tmp.level,tmp.x,tmp.y)){ vis[tmp.level][tmp.x][tmp.y]=1; q.push(tmp); } } tmp.level=s.level-1; tmp.x=s.x; tmp.y=s.y; tmp.t=s.t+1; if(judge_State(tmp.level,tmp.x,tmp.y)){ vis[tmp.level][tmp.x][tmp.y]=1; q.push(tmp); } tmp.level=s.level+1; tmp.x=s.x; tmp.y=s.y; tmp.t=s.t+1; if(judge_State(tmp.level,tmp.x,tmp.y)){ vis[tmp.level][tmp.x][tmp.y]=1; q.push(tmp); } } flag=false; } int main(){ #ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif while(~scanf("%d%d%d",&L,&R,&C)){ if(!L&&!R&&!C) break; for(int i=0;i<L;i++){ for(int j=0;j<R;j++){ scanf("%s",map[i][j]); } getchar(); } for(int i=0;i<L;i++){ for(int j=0;j<R;j++){ for(int k=0;k<C;k++){ if(map[i][j][k]=='S'){ sl=i,sx=j,sy=k; } if(map[i][j][k]=='E'){ el=i,ex=j,ey=k; } } } } Bfs(); if(!flag) puts("Trapped!"); } return 0; }