poj2251Dungeon Master
最简单的BFS求最短距离,只是改一下方向数组就可以,二维数组改为三维数组
下面是AC代码
对了,下面用的c++队列,其实很简单,就只有几种操作:
先介绍队列的定义 queue<类型名>变量名,如
queue<int>q,queue或queue<node>que;(struct node(结构体类型));
1、 q.front() 取出队首元素
2、 q.empty() 判断是否为空,时空返回1
3、 q.pop() 删除队首元素
4、 q.push(变量)加入变量
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<queue> 5 #include<string> 6 #include<stack> 7 #include<cmath> 8 #include<cctype> 9 #include<iostream> 10 #include<set> 11 #include<algorithm> 12 #include<ctime> 13 #include<vector> 14 using namespace std; 15 #define mem(a) memset(a,0,sizeof(a)) 16 #define MAXN 1000000007 17 #define judge(x,y,z) !vis[x][y][z]&&map[x][y][z]!='#'&&x>=0&&x<l&&y>=0&&y<m&&z>=0&&z<n 18 int d[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; 19 bool vis[35][35][35]; 20 char map[35][35][35]; 21 int l,m,n; 22 struct node 23 { 24 int x,y,z; 25 int step; 26 }; 27 int BFS(int x,int y,int z) 28 { 29 mem(vis); 30 queue<node>q; 31 node u; 32 u.x=x;u.y=y;u.z=z; 33 u.step=0; 34 q.push(u); 35 while(!q.empty()) 36 { 37 u=q.front(); 38 if(map[u.x][u.y][u.z]=='E')return u.step; 39 q.pop(); 40 int i; 41 for(i=0;i<6;i++) 42 { 43 node v; 44 v.x=u.x+d[i][0];v.y=u.y+d[i][1]; 45 v.z=u.z+d[i][2]; 46 if(judge(v.x,v.y,v.z)) 47 { 48 vis[v.x][v.y][v.z]=true; 49 v.step=u.step+1; 50 q.push(v); 51 } 52 } 53 } 54 return 0; 55 } 56 int main() 57 { 58 while(~scanf("%d%d%d%*c",&l,&m,&n)) 59 { 60 mem(map); 61 if(!m&&!n&&!l)break; 62 int i,j,k,sx,sy,sz; 63 for(i=0;i<l;i++) 64 for(j=0;j<m;j++){ 65 scanf("%s",map[i][j]); 66 for(k=0;k<n;k++) 67 { 68 if(map[i][j][k]=='S')sx=i,sy=j,sz=k; 69 } 70 } 71 int step=BFS(sx,sy,sz); 72 if(step)printf("Escaped in %d minute(s).\n",step); 73 else printf("Trapped!\n"); 74 } 75 return 0; 76 }