POJ 2251 Dungeon Master
题意:三维搜索,一次一格方向上下左右前后,问从S到E的最小步数。
分析:算最短步数,简单宽度搜索。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <queue> 6 #include <cmath> 7 #include <stack> 8 #include <set> 9 #include <map> 10 #include <algorithm> 11 using namespace std; 12 #define ll long long 13 #define inf 0x3f3f3f3f 14 char g[31][31][31]; 15 bool v[31][31][31]; 16 int l,r,c; 17 int sx,sy,sz,ex,ey,ez; 18 int to[6][3]={0,0,1,0,0,-1,1,0,0,-1,0,0,0,1,0,0,-1,0};//移动方向,6个方向,每个三维的移动步数 19 struct node 20 { 21 int x,y,z,t; 22 };//把每一步看做一次策略,t记录到这一点所需步数 23 int bfs() 24 { 25 int i,j,k; 26 node a,b; 27 a.x=sx,a.y=sy,a.z=sz; 28 a.t=0; 29 queue<node> q; 30 v[sz][sx][sy]=1; 31 q.push(a); 32 while(!q.empty()) 33 { 34 b=q.front(); 35 q.pop(); 36 if(b.x==ex&&b.y==ey&&b.z==ez) 37 return b.t; 38 for(i=0;i<6;i++) 39 { 40 a.x=b.x+to[i][0]; 41 a.y=b.y+to[i][1]; 42 a.z=b.z+to[i][2]; 43 if(a.x>=0&&a.x<r&&a.y>=0&&a.y<c&&a.z>=0&&a.z<l&&g[a.z][a.x][a.y]!='#'&&!v[a.z][a.x][a.y]) 44 { 45 a.t=b.t+1; 46 v[a.z][a.x][a.y]=1; 47 q.push(a); 48 } 49 } 50 } 51 return -1;//能到的路都走完了还没到 52 } 53 int main() 54 { 55 int i,j,k; 56 while(~scanf("%d %d %d",&l,&r,&c)) 57 { 58 if(l==0&&r==0&&c==0) break; 59 memset(v,0,sizeof v); 60 for(i=0;i<l;i++) 61 { 62 for(j=0;j<r;j++) 63 for(k=0;k<c;k++) 64 { 65 cin>>g[i][j][k]; 66 if(g[i][j][k]=='S') sz=i,sx=j,sy=k; 67 if(g[i][j][k]=='E') ez=i,ex=j,ey=k; 68 } 69 } 70 int s=bfs(); 71 if(s==-1) 72 printf("Trapped!\n"); 73 else printf("Escaped in %d minute(s).\n",s); 74 } 75 return 0; 76 }