NYOJ 353 3D Dungeon(三维bfs)


       这道题是三维地图去找最短路,所以类比着二维地图的广搜过程做就行了,只用在搜索方向上做点改变。


AC代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct Node{
  int x,y,z,step;
}Next,Now,S,E;
char MAP[35][35][35];
int vis[35][35][35];
int l,r,c;
int dir[6][3] = {1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};    // 三维地图的六个方向

int bfs(){
  queue<Node> q;
  S.step = 0;
  memset(vis,0,sizeof(vis));
  q.push(S);
  while(!q.empty()){
    Now = q.front();
    q.pop();
    if(Now.x == E.x &&Now.y == E.y &&Now.z == E.z){
      return Now.step;
    }
    for(int i=0;i<6;i++){           // 类比二维地图 在这里稍微改变下就行了
      Next.x = Now.x + dir[i][0];
      Next.y = Now.y + dir[i][1];
      Next.z = Now.z + dir[i][2];
      if(Next.x>=0&&Next.y>=0&&Next.z>=0&&Next.x<l&&Next.y<r&&Next.z<c&&MAP[Next.x][Next.y][Next.z]!='#'&&vis[Next.x][Next.y][Next.z]==0){
        vis[Next.x][Next.y][Next.z] = 1;
        Next.step = Now.step + 1;
        q.push(Next);
      }
    }
  }
  return -1;

}
int main()
{
  while(~scanf("%d%d%d",&l,&r,&c)){
    if(l==0&&r==0&&c==0) break;
    memset(MAP,0,sizeof(MAP));
    for(int i=0;i<l;i++){              // 初始化地图
      for(int j=0;j<r;j++){
        for(int k = 0;k<c;k++){
          cin>>MAP[i][j][k];
          if(MAP[i][j][k]=='S'){       // 标记起点
            S.x = i;
            S.y = j;
            S.z = k;
          }
          if(MAP[i][j][k]=='E'){       // 标记终点
            E.x = i;
            E.y = j;
            E.z = k;
          }
        }
      }
    }
    int temp = bfs();
    if(temp == -1){
      cout<<"Trapped!"<<endl;
    }
    else {
      cout<<"Escaped in "<<temp<<" minute(s)."<<endl;
    }
  }
  return 0;
}
/***
   [来源] NYOJ 353
   [题目] 3Ddungeon
   [思路]
      这是一道三维搜索题,也不是很难,类比二维地图去做就好了。
   [输入]
      3 4 5
      S....
      .###.
      .##..
      ###.#

      #####
      #####
      ##.##
      ##...

      #####
      #####
      #.###
      ####E

      1 3 3
      S##
      #E#
      ###

      0 0 0
   [输出]
      Escaped in 11 minute(s).
      Trapped
*/






全部评论

相关推荐

2025-12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务