这个不剪枝的话必TLE
还有可能出口是墙,我被这种情况坑了
#include<cstdio>
#include<string.h>
#include<stdlib.h>
bool map[55][55][55];
bool visit[55][55][55];
int a,b,c,step;
int p[7]={0,0,0,0,1,-1};
int q[7]={0,0,1,-1,0,0};
int r[7]={1,-1,0,0,0,0};
int x[130000],y[130000],z[130000],s[130000];
int bfs(){
int front=0,rear=0;
x[rear]=1;y[rear]=1;z[rear]=1;s[rear++]=0;
visit[1][1][1]=1;
while(front<rear){
int xx=x[front];
int yy=y[front];
int zz=z[front];
for(int i=0;i<6;i++){
int xxx=xx+p[i];
int yyy=yy+q[i];
int zzz=zz+r[i];
if(xxx==a && yyy==b && zzz==c)
return s[front]+1;
if(s[front]+1>=step)
continue;
if(xxx<1 || xxx>a || yyy<1 || yyy>b || zzz<1 || zzz>c)
continue;
if(map[xxx][yyy][zzz])
continue;
if(visit[xxx][yyy][zzz])
continue;
x[rear]=xxx;y[rear]=yyy;z[rear]=zzz;s[rear]=s[front]+1;
visit[xxx][yyy][zzz]=1;
rear++;
}
front++;
}
return -1;
}
int main(){
int T,t,i,j,k,tem;
scanf("%d",&T);
for(t=1;t<=T;t++){
scanf("%d %d %d %d",&a,&b,&c,&step);
memset(map,0,sizeof(map));
memset(visit,0,sizeof(visit));
for(i=1;i<=a;i++){
for(j=1;j<=b;j++){
for(k=1;k<=c;k++)
scanf("%d",&map[i][j][k]);
}
}
if(map[a][b][c]){
printf("-1\n");
continue;
}
if(a+b+c>step){
printf("-1\n");
continue;
}
tem=bfs();
if(tem==-1)
printf("-1\n");
else
printf("%d\n",tem);
}
}