1248:Dungeon Master 2021-01-05

简介: 1248:Dungeon Master 2021-01-05

1248:Dungeon Master

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。

【输入】

多组测试数据。

一组测试测试数据表示一个三维迷宫:

前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。

【输出】

最小移动次数。

【输入样例】

3 4 5

S....

.###.

.##..

###.#

#####

#####

##.##

##...

#####

#####

#.###

####E

1 3 3

S##

#E#

###

0 0 0

【输出样例】

Escaped in 11 minute(s).

Trapped!

【提示】

对于题目给出数据的含义就是输入l,r,c,分别代表迷宫有l层,每层长宽分别是c,r。对于数据以可以这样移动:

(1,1,1)->(1,1,2)->(1,1,3)->(1,1,4)->(1,1,5)->(1,2,5)->

(1,3,5)->(1,3,4)->(1,4,4)->(2,4,4)->(2,4,5)->(3,4,,5)

共11步就可以到达终点 对于数据二明显不能到达,则输出Trapped!

这题用BFS解,每次去队首元素,如果是终点则输出结果移动的次数,否则,从该点开始分别向东南西北上下移动(如果可以走的话)并继续搜,如果到队列为空还没搜到解法,则说明无解。

1. #include <iostream>
2. #include <cstdio>
3. #include <cstring>
4. using namespace std;
5. int s[30][30][30];
6. int que[100][5];
7. int c,k,g,i,j,f;
8. int z[6]={0,0,0,0,-1,1};
9. int x[6]={-1,1,0,0,0,0};
10. int y[6]={0,0,-1,1,0,0};
11. int jz,jx,jy;
12. bool bl;
13. char a;
14. void sca(){
15.   memset(s,0,sizeof(s));
16.   for(i=1;i<=g;i++){
17.     for(j=1;j<=k;j++){
18.       for(f=1;f<=c;f++){
19.         cin>>a;
20.         if(a=='S') {
21.           s[i][j][f]=1;
22.           que[1][1]=i;que[1][2]=j;que[1][3]=f;que[1][4]=0;
23.         }
24.         else if(a=='E') {
25.           s[i][j][f]=0;
26.           jz=i;jx=j;jy=f;
27.         }
28.         else if(a=='#') s[i][j][f]=1; 
29.         else if(a=='.') s[i][j][f]=0;
30.         //printf("%c",a);
31.       } 
32.     }
33.     //printf("\n");
34.   }   
35. }
36. void bfs(){
37.   bl=false;
38.   int t=0,w=1;
39.   do {
40.     t++;
41.     for(int i=0;i<6;i++){
42.       int zz=que[t][1]+z[i];
43.       int xx=que[t][2]+x[i];
44.       int yy=que[t][3]+y[i];
45.       if(zz>0&&zz<=g&&xx>0&&xx<=k&&yy>0&&yy<=c&&s[zz][xx][yy]==0){
46.         s[zz][xx][yy]=1;
47.         w++;
48.         que[w][1]=zz;que[w][2]=xx;que[w][3]=yy;que[w][4]=que[t][4]+1;
49.         if(zz==jz&&xx==jx&&yy==jy){
50.           printf("Escaped in %d minute(s).\n",que[w][4]);
51.           bl=true;break;
52.         }
53. 
54.       }
55.     }
56.   }while(w>t&&bl==false);
57.   if(!bl) printf("Trapped!\n");
58. }
59. int main(int argc, char *argv[])
60. {
61.   while(1){
62.     scanf("%d %d %d",&g,&k,&c);
63.     if(g==0||k==0||c==0) return 0;
64.     sca();
65.     bfs();
66.   }
67.   return 0;
68. }

 

相关文章
|
2月前
|
安全
8-17|2023-08-16 12:33:55,972 [salt.master :1643][ERROR ][20321] Received minion error from [m
8-17|2023-08-16 12:33:55,972 [salt.master :1643][ERROR ][20321] Received minion error from [m
|
6月前
|
Java
HDU-1551-Cable master
HDU-1551-Cable master
25 0
|
6月前
|
流计算
POJ 3620--Avoid The Lakes【DFS】
POJ 3620--Avoid The Lakes【DFS】
32 0
Dungeon Master(BFS广度优先搜索)
Dungeon Master(BFS广度优先搜索)
40 0
CF1365D Solve The Maze (BFS)
CF1365D Solve The Maze (BFS)
86 0
CF1365D Solve The Maze (BFS)
CodeForces 377A-Maze(DFS找连通块)
CodeForces 377A-Maze(DFS找连通块)
CodeForces 377A-Maze(DFS找连通块)
Dungeon Master
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 with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot move diagonally and the maze is surrounded by solid rock on all
126 0