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. }

 

相关文章
|
5月前
|
PHP 开发工具 git
BUU [BJDCTF2020]Mark loves cat
BUU [BJDCTF2020]Mark loves cat
59 0
|
8月前
|
Java
HDU-1551-Cable master
HDU-1551-Cable master
33 0
|
8月前
|
Web App开发 监控 JavaScript
【Node系列】REPL详解
Node.js REPL(Read-Eval-Print Loop)是一个交互式环境,允许用户在命令行中直接输入JavaScript代码并立即看到结果。REPL是Node.js的一个重要组成部分,它提供了一个方便的方式来测试代码片段、快速尝试新功能或进行调试。
136 1
Dungeon Master(BFS广度优先搜索)
Dungeon Master(BFS广度优先搜索)
45 0
UVA532-Dungeon Master(三维迷宫BFS)
UVA532-Dungeon Master(三维迷宫BFS)
UVA532-Dungeon Master(三维迷宫BFS)
|
机器人 定位技术
HDU-1035,Robot Motion(DFS+模拟)
HDU-1035,Robot Motion(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
129 0
|
人工智能
看MASTER围棋有感
看MASTER围棋有感
144 0