poj 2251 Dungeon Master(简单三维广搜)

题意:

         之前做过的所有题都是   在一个平面   上搜索 。

         本题很新,在一个三维空间里 ,首先   l  x  y   分别代表 l 层   每一层有 x 行   y 列  

         问从 S 开始   走到 E   最小步是多少    显然用广搜,只是多了一个向上向下的搜索。

 

注意:

        所谓广搜  ,是一层一层的搜,  每一层其步数是一样的   ,可以通过建立一个数组存步数 ,也可以 将步数同时存入队列中

        另外搜过的要做标记, 在做标记时  尽量要在里面做标记(就是每搜过一个点就  立马 将之标记)不然一个点也会多次进入队列  ,会爆内存。

       如: 假设队列里为a,b, 此时 a出队列  1,2,3,4 进队列 ,第二次 b出队列   ,如果1不在里面标记的话  ,1就会又一次进队列,显然多余!!

                                   要知道一个点  第一次   被访问的时候所  用的步数  一定是最小的,

                                   所以   以后  该点再被访问的话    肯定步数比第一次大   ,就没必要再进行它之后的路径搜索  ,即就没必要进队列。

 

 

小改善:

        可以通过定义数组   模拟   队列  的先进先出

        可以   把要进队列的所有内容    存入结构体    直接push结构体    直接front结构体    更简单

        可以   把下面代码bfs里的   6个方向搜索   合并   成   一个   for循环

 

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <list>
 14 #include <map>
 15 #include <set>
 16 using namespace std;
 17 /*10^8-----1s*/
 18 /***************************************/
 19 typedef vector<int> VI;
 20 typedef vector<char> VC;
 21 typedef vector<string> VS;
 22 typedef set<int> SI;
 23 typedef set<string> SS;
 24 typedef map<int ,int> MII;
 25 typedef map<string,int> MSI;
 26 typedef pair<int,int> PII;
 27 typedef vector<PII> VII;
 28 typedef vector<VI > VVI;
 29 /***************************************/
 30 #define min(a,b) (a>b?b:a)
 31 #define max(a,b) (a>b?a:b)
 32 
 33 #define clr(a,b) memset(a,b,sizeof(a))
 34 #define all(x)    (x).begin(), (x).end()
 35 #define sz(x) ((int)(x).size())
 36 #define ll long long
 37 #define int64 __int64
 38 #define pb push_back
 39 #define mp make_pair
 40 #define LL(x) ((x)<<1)
 41 #define RR(x) ((x)<<1|1)
 42 #define ri(x) scanf("%d",&x)
 43 #define rii(x,y) scanf("%d%d",&x,&y)
 44 #define rd(x) scanf("%lf",&x)
 45 #define rdd(x,y) scanf("%lf%lf",&x,&y)
 46 #define rs(x) scanf("%s",x)
 47 #define pi(x) printf("%d",x)
 48 #define pin(x) printf("%d\n",x)
 49 #define ps(x) printf("%s",x)
 50 #define pn()  printf("\n")
 51 #define sqr(x) ((x)*(x))
 52 #define rep(i,a,b)  for(int i=(a);i<(b);i++)
 53 #define repu(i,a,b) for(int i=(a);i<=(b);i++)
 54 #define repd(i,a,b) for(int i=(a);i>=(b);i--)
 55 #define repc(i,a,c) for(int i=(a);(c);i++)
 56 /***************************************/
 57 const int INF = 0x7f7f7f7f;
 58 const double eps = 1e-8;
 59 const double PIE=acos(-1.0);
 60 const int dx[]= {0,-1,0,1};
 61 const int dy[]= {1,0,-1,0};
 62 const int fx[]= {-1,-1,-1,0,0,1,1,1};
 63 const int fy[]= {-1,0,1,-1,1,-1,0,1};
 64 /***************************************/
 65 void openfile()
 66 {
 67     freopen("data.in","rb",stdin);
 68     freopen("data.out","wb",stdout);
 69 }
 70 /**********************The End OF The Template*****************/
 71 
 72 char map_[33][33][33];
 73 int l,x,y;
 74 
 75 int eh,ei,ej;//E点所在的坐标
 76 
 77 int cnt,flag;//cnt记录步数
 78 
 79 
 80 //进行广搜
 81 void bfs(int h,int xx,int yy)
 82 {
 83     queue<int >q;//广搜   首先定义队列
 84     q.push(h);
 85     q.push(xx);
 86     q.push(yy);
 87     q.push(0);
 88     flag=0;
 89     while(!q.empty())
 90     {
 91         // ###################### 
 92         int h1=q.front();
 93         q.pop();
 94         int x1=q.front();
 95         q.pop();
 96         int y1=q.front();
 97         q.pop();
 98         cnt=q.front();
 99         q.pop();
100 
101         if(eh==h1&&ei==x1&&ej==y1)
102         {
103             flag=1;
104             return;
105         }
106 
107         /*//内存超限的原因
108            if(eh==h1&&ei==x1&&ej==y1)
109          {
110              flag=1;
111              return;
112          }
113          else
114              map_[h1][x1][y1]='#';//在外面做标记!!!容易重复访问,并重复存入队列
115         */
116 
117         if(h1+1<l&&map_[h1+1][x1][y1]!='#')//上搜
118         {
119             map_[h1+1][x1][y1]='#';//在里面  做标记!!!!!!
120             q.push(h1+1);
121             q.push(x1);
122             q.push(y1);
123             q.push(cnt+1);
124         }
125         if(h1-1>=0&&map_[h1-1][x1][y1]!='#')//下搜
126         {
127             map_[h1-1][x1][y1]='#';
128             q.push(h1-1);
129             q.push(x1);
130             q.push(y1);
131             q.push(cnt+1);
132         }
133         if(x1+1<x&&map_[h1][x1+1][y1]!='#')//左搜
134         {
135             map_[h1][x1+1][y1]='#';
136             q.push(h1);
137             q.push(x1+1);
138             q.push(y1);
139             q.push(cnt+1);
140         }
141         if(x1-1>=0&&map_[h1][x1-1][y1]!='#')//右搜
142         {
143             map_[h1][x1-1][y1]='#';
144             q.push(h1);
145             q.push(x1-1);
146             q.push(y1);
147             q.push(cnt+1);
148         }
149         if(y1+1<y&&map_[h1][x1][y1+1]!='#')//前搜
150         {
151             map_[h1][x1][y1+1]='#';
152             q.push(h1);
153             q.push(x1);
154             q.push(y1+1);
155             q.push(cnt+1);
156         }
157         if(y1-1>=0&&map_[h1][x1][y1-1]!='#')//后搜
158         {
159             map_[h1][x1][y1-1]='#';
160 
161             q.push(h1);
162             q.push(x1);
163             q.push(y1-1);
164             q.push(cnt+1);
165         }
166         // ###################### 
167     }
168 }
169 
170 int main()
171 {
172 
173     int jh,ji,jj;
174     int h,i,j;
175     while(scanf("%d %d %d",&l,&x,&y)!=EOF)
176     {
177         if(l==0&&x==0&&y==0)
178             break;
179             
180         /*输入*/
181         for(h=0; h<l; h++)
182         {
183             for(i=0; i<x; i++)
184             {
185                 getchar();
186                 for(j=0; j<y; j++)
187                 {
188                     scanf("%c",&map_[h][i][j]);
189                     if(map_[h][i][j]=='S')
190                     {
191                         jh=h;
192                         ji=i;
193                         jj=j;
194                     }
195                     if(map_[h][i][j]=='E')
196                     {
197                         eh=h;
198                         ei=i;
199                         ej=j;
200                     }
201                 }
202             }
203             getchar();
204         }
205         
206         /*进行搜索*/
207         map_[jh][ji][jj]='#';
208         bfs(jh,ji,jj);
209         
210         /*输出*/
211         if(!flag)
212             printf("Trapped!\n");
213         else
214             printf("Escaped in %d minute(s).\n",cnt);
215             
216     }
217     return 0;
218 }
View Code

 

posted @ 2014-09-27 17:04  bibier  阅读(223)  评论(0编辑  收藏  举报