基础bfs
不能重复的bfs
一次ac

#include<bits/stdc++.h> using namespace std; int world[51][51][51]; int d[51][51][51]; int a,b,c,time1; struct node { int x,y,z; node(int x=0,int y=0,int z=0):x(x),y(y),z(z){} }; void bfs() { memset(d,-1,sizeof(d)); int dx[6]={0,0,1,-1,0,0}; int dy[6]={1,0,0,0,-1,0}; int dz[6]={0,1,0,0,0,-1}; node u(1,1,1); d[1][1][1]=0; queue<node>q; q.push(u); while(!q.empty()) { u=q.front();q.pop(); if(u.x==a&&u.y==b&&u.z==c&&d[u.x][u.y][u.z]<=time1) {printf("%d ",d[u.x][u.y][u.z]);return;} for(int i=0;i<6;i++) { node v(u.x+dx[i],u.y+dy[i],u.z+dz[i]); if(v.x>=1&&v.x<=a&&v.y>=1&&v.y<=b&&v.z>=1&&v.z<=c&&world[v.x][v.y][v.z]==0&&d[v.x][v.y][v.z]==-1) { d[v.x][v.y][v.z]=d[u.x][u.y][u.z]+1; q.push(v); } } } printf("-1 "); } int main() { int cas;cin>>cas; while(cas--) { scanf("%d%d%d%d",&a,&b,&c,&time1); for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) for(int s=1;s<=c;s++) scanf("%d",&world[i][j][s]); bfs(); } return 0; }