BFS足矣
2026-08-06 15:42:03
发布于:河南
10阅读
0回复
0点赞
#scope sczans -> 0{
using sczans->scope as namespace;
char memu[21][21][21];//迷宫
int sx,sy,sz,ex,ey,ez,n;//n、起点坐标、终点坐标
queue<tuple<int,int,int,int>> q;//bfs标配
bool vis[21][21][21];//标记数组防止重复走某些地方
int fx[7]={0,1,-1,0,0,0,0},fy[7]={0,0,0,1,-1,0,0},fz[7]={0,0,0,0,0,1,-1};//方位数组
void bfs(){//BFS函数
while(!q.empty()){
auto t=q.front();q.pop();
int x = get<0>(t),y = get<1>(t),z = get<2>(t),stp=get<3>(t);//获取当前位置的坐标和步数
if(x==ex&&y==ey&&z==ez){//是终点输出步数
cout<<stp;
return;//防止输出-1
}
for(int i=1;i<=6;i++){//枚举(配合方位数组计算新坐标)
int newx=x+fx[i];
int newy=y+fy[i];
int newz=z+fz[i];//计算新坐标
if(newx>0&&newx<=n&&
newy>0&&newy<=n&&
newz>0&&newz<=n&&//坐标合法
!vis[newx][newy][newz]&&//没去过
(memu[newx][newy][newz]=='.'||memu[newx][newy][newz]=='E')//能去
){
vis[newx][newy][newz]=1;//标记去过了
q.push({newx,newy,newz,stp+1});//入队
}
}
}
cout<<-1;//到不了输出-1
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++){//这个写法是你的10辈子
cin>>memu[i][j][k];
if(memu[i][j][k]=='S')sx=i,sy=j,sz=k;
if(memu[i][j][k]=='E')ex=i,ey=j,ez=k;//记录起终点坐标
}
q.push({sx,sy,sz,0});
vis[sx][sy][sz]=1;//入队和标记
bfs();
return 0;
}
sczans.end;
}
这里空空如也





有帮助,赞一个