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 }

 

posted @ 2016-10-16 22:03  Nautilus1s  阅读(149)  评论(0编辑  收藏  举报