三维的BFS 注意方向即可
以及一旦当前BFS到的时间大于t时,直接break返回-1
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=55;
const int INF=1<<30;
struct node{
int x,y,z;
node(int x,int y,int z):x(x),y(y),z(z){}
node(){}
};
int map[N][N][N];
int dis[N][N][N];
int a,b,c,t;
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
int bfs(){
int ans=0;
queue<node> q;
map[0][0][0]=1;
dis[0][0][0]=0;
q.push(node(0,0,0));
while(!q.empty()){
node first=q.front();
q.pop();
if(first.x==a-1&&first.y==b-1&&first.z==c-1) return dis[a-1][b-1][c-1];
node next;
for(int i=0;i<6;i++){
next.x=first.x+dx[i],next.y=first.y+dy[i],next.z=first.z+dz[i];
if(next.x>=0&&next.x<a&&next.y>=0&&next.y<b&&next.z>=0&&next.z<c&&map[next.x][next.y][next.z]==0&&dis[next.x][next.y][next.z]==INF){
dis[next.x][next.y][next.z]=dis[first.x][first.y][first.z]+1;
q.push(next);
map[next.x][next.y][next.z]=1;
if(dis[next.x][next.y][next.z]>t) return -1;
}
}
}
return -1;
}
int main(){
int k;
scanf("%d",&k);
while(k--){
scanf("%d %d %d %d",&a,&b,&c,&t);
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
for(int m=0;m<c;m++){
scanf("%d",&map[i][j][m]);
dis[i][j][m]=INF;
}
}
}
printf("%d\n",bfs());
}
}