POJ-2251-Dungeon Master
http://poj.org/problem?id=2251
基本的三维BFS,用队列写的
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> using namespace std; int n1,n2,n3; char map[40][40][40]; int visit[40][40][40]; int dir[6][3]={{1,0,0},{-1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}}; struct node { int x; int y; int z; int time; }; int go(int x,int y,int z) { if(0<=x&&x<n1&&0<=y&&y<n2&&0<=z&&z<n3&&map[x][y][z]=='.') return 1; return 0; } int bfs(node s1,node s2) { int i; queue<node>q; node st,ed; st.x=s1.x; st.y=s1.y; st.z=s1.z; st.time=0; memset(visit,0,sizeof(visit)); visit[st.x][st.y][st.z]=1; map[s2.x][s2.y][s2.z]='.'; q.push(st); while(!q.empty()) { st=q.front(); q.pop(); if(st.x==s2.x&&st.y==s2.y&&st.z==s2.z) return st.time; for(i=0;i<6;i++) { ed.x=st.x+dir[i][0]; ed.y=st.y+dir[i][1]; ed.z=st.z+dir[i][2]; if(!visit[ed.x][ed.y][ed.z]&&go(ed.x,ed.y,ed.z)) { ed.time=st.time+1; visit[ed.x][ed.y][ed.z]=1; q.push(ed); } } } return -1; } int main() { node st,ed; int i,j,k,ans; while(scanf("%d%d%d",&n1,&n2,&n3),n1||n2||n3) { for(i=0;i<n1;i++) { getchar(); for(j=0;j<n2;j++) scanf("%s",map[i][j]); } for(i=0;i<n1;i++) for(j=0;j<n2;j++) for(k=0;k<n3;k++) { if(map[i][j][k]=='S') { st.x=i; st.y=j; st.z=k; } else if(map[i][j][k]=='E') { ed.x=i; ed.y=j; ed.z=k; } } ans=bfs(st,ed); if(ans==-1) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",ans); } return 0; }