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 }

时间: 2024-11-05 16:42:07

poj 2251 Dungeon Master(简单三维广搜)的相关文章

POJ 2251 Dungeon Master【三维BFS模板】

Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45743 Accepted: 17256 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled wi

POJ - 2251 Dungeon Master(三维BFS)

题目链接:http://poj.org/problem?id=2251 题意:三维BFS. 题解:大水题,只不过多加了两个方向 1 //poj2251 2 #include <queue> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 int sx,sy,sz,ex,ey,ez,L,R,C; 8 const int INF=

POJ 2251:Dungeon Master(三维BFS)

Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16178 Accepted: 6268 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled wit

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是相连通的.(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住. /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */ #include <cstdio> #i

POJ 2251 Dungeon Master(地牢大师)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

BFS POJ 2251 Dungeon Master

题目传送门 1 /* 2 BFS:这题很有意思,像是地下城,图是立体的,可以从上张图到下一张图的对应位置,那么也就是三维搜索,多了z坐标轴 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <queue> 8 using namespace std; 9 10 const int MAXN = 33; 11 const int INF = 0x3f3

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

POJ 2251 Dungeon Master (广搜)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18773   Accepted: 7285 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled