p9909题解
这么水的题居然还没有题解,我来水一发。
通过题意很明显就能得知是 bfs
搜索题,用一个队列来维护,注意点就是不要走重复的路,还有相较于传统的二维迷宫问题,此题是一个三维的迷宫,其实也很简单,将数组开到三维即可。
注意有 $6$ 个方向,二维的上下左右和上一层与下一层。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,stx,sty,stz,edx,edy,edz;
char mp[N][N][N];//三维数组
bool vis[N][N][N];//三维数组,用来标记每个点是否经过
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};//6个方向
struct date{
int x,y,z,s;//s记录步数
};
bool check(int x,int y,int z){
return x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n&&!vis[x][y][z]&&mp[x][y][z]!='1';//判断是否越界,是否访问,是否为障碍
}
int bfs(int x,int y,int z){
queue<date> q;//队列维护bfs
q.push({x,y,z,0});//起点入队
vis[x][y][z]=true;//标记起点,不然会死循环
while(!q.empty()){
date t=q.front();
q.pop();
if(t.x==edx&&t.y==edy&&t.z==edz){
return t.s;//找到答案返回步数
}
for(int i=0;i<6;i++){
int dx=t.x+dir[i][0];//移动x坐标
int dy=t.y+dir[i][1];//移动y坐标
int dz=t.z+dir[i][2];//移动z坐标
if(check(dx,dy,dz)){//判断
q.push({dx,dy,dz,t.s+1});
vis[dx][dy][dz]=true;
}
}
}
return -1;//走不通返回-1
}
int main(){
cin>>n;
cin>>stx>>sty>>stz>>edx>>edy>>edz;//输入起点与终点
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
cin>>mp[j][k][i];//输入地图
}
}
}
int ans=bfs(stx,sty,stz);
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】