Dungeon Master(BFS广度优先搜索)

简介: Dungeon Master(BFS广度优先搜索)

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


Is an escape possible? If yes, how long will it take?

Input


The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).

L is the number of levels making up the dungeon.

R and C are the number of rows and columns making up the plan of each level.

Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.

Output


Each maze generates one line of output. If it is possible to reach the exit, print a line of the form

Escaped in x minute(s).


where x is replaced by the shortest time it takes to escape.

If it is not possible to escape, print the line

Trapped!


Sample Input

3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0


Sample Output

1. Escaped in 11 minute(s).
2. Trapped!


题目分析其实这是一道简单的三维BFS的题目,相比较与其他二维BFS迷宫问题,三维只是多加了一个楼层,那么我们就把二维转化为三维,其他的与二维迷宫差不了太多。详细解释在代码中,我已经解释得很详尽了,希望各位可以听懂。

  #include <iostream>
  #include <algorithm>
  #include <cstdio>
  #include <cstring>
  using namespace std;
  struct node
  {
      int x;
      int y;
      int z;
      int num;
  } link[40000];
  int op, tp, l, m,ll, n, flag, ans;
  int v[44][44][44];
  char st[44][44][44];
  int jk[6][3] = {{0, 1, 0}, {1, 0, 0}, {0, -1, 0}, {-1, 0, 0}, {0, 0, -1}, {0, 0, 1}};
  bool Judge(int dz, int dx, int dy)
  {
      if(dx < 0 || dx >= m || dy < 0 || dy >= n || dz < 0 || dz >= l)
      return false;
      else
      return true;
  }
  int main()
  {
    //  int i, j, k;
      while(scanf("%d%d%d", &l, &m, &n)&& (l != 0 || n != 0 || m != 0))//几个圈每个圈的行和列 
      {
          op = tp = flag = 0;
          memset(v, 0, sizeof(v));
          for(int i = 0; i < 40000; i++)//应该初始化 
              link[i].num = 0;
          for(int i = 0; i < l; i++)
              for(int j = 0; j < m; j++)//有几个圈 
                  scanf("%s", st[i][j]);//每个圈 由多少行 
          for(int i = 0; i < l; i++)//几个圈 
              for(int j = 0; j < m; j++)//几行 
                  for(int k = 0; k < n; k++)//几列 
                      if(st[i][j][k] == 'S'){
                        link[tp].z = i;//第几圈
                          link[tp].x = j;  //第几行                          
                          link[tp].y = k;//第几列 
                          tp++;
                          v[i][j][k] = 1;//标记作用 
                          break;
                  }
           int x, y, z, i;
      while(op < tp)
      {
          for(i = 0; i < 6; i++)
          {
              x = link[op].x + jk[i][0];//行
              y = link[op].y + jk[i][1];//列 
              z = link[op].z + jk[i][2];//圈 
              if(Judge(z, x, y) && v[z][x][y] == 0)
              {
                  if(st[z][x][y] == '.')//s移动到这里了 
                  {
                      v[z][x][y] = 1;
                      link[tp].x = x;
                      link[tp].y = y;
                      link[tp].z = z;
                      link[tp].num = link[op].num + 1;//加一分钟 
                      tp++;
                  }
                  else if(st[z][x][y] == 'E')//终点 
                  {
                      v[z][x][y] = 1;
                      flag = 1;
                      ans = link[op].num + 1;
                      //cout<<ans<<endl;
                      break;
                  }
              }
          }
          //if(flag)//!=0
              //break;
          op++;//一套大循环加一次 
      }
          if(flag)//!=0
              printf("Escaped in %d minute(s).\n", ans);
          else
              printf("Trapped!\n");
      }
      return 0;
  }


相关文章
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1014 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1709 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
652 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
618 12
|
10天前
|
人工智能 自然语言处理 API
Next AI Draw.io:当AI遇见Draw.io图表绘制
Next AI Draw.io 是一款融合AI与图表绘制的开源工具,基于Next.js实现,支持自然语言生成架构图、流程图等专业图表。集成多款主流大模型,提供智能绘图、图像识别优化、版本管理等功能,部署简单,安全可控,助力技术文档与系统设计高效创作。
689 151