//本题的难度不大大、、只需要用BFS就好了,但是要注意的是,题目给的数据还是很坑的,在做的时候应该多多注意,比如最后一个出口也可以是墙(好坑啊),虽然第一个也可以是墙但是第一个可以忽略,我刚刚开始就是这样错了 以为不可以忽略,错了半个小时,后来才知道,一个字坑啊,,,这个题目还是很具有BFS的代表性的,不可以用优先队列哦 否则会超时
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
struct node
{
int x;
int y;
int z;
int times;
};
int map[60][60][60];
int v[60][60][60];
int x,y,z,t;
int d[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int BFS()
{
int i,j,k,x1,y1,z1;
queue<node>q;
node st,en;
st.x=0;
st.y=0;
st.z=0;
st.times=0;
q.push(st);
v[0][0][0]=1;
// for(i=0;i<6;i++)
// printf("%d %d %d\n",d[i][0],d[i][1],d[i][2]);
while(!q.empty())
{
st=q.front();
q.pop();
if(st.x==x-1&&st.y==y-1&&st.z==z-1&&st.times<=t)
{
return st.times;
}
for(i=0;i<6;i++)
{
x1=st.x+d[i][0];
y1=st.y+d[i][1];
z1=st.z+d[i][2];
if(map[x1][y1][z1]==0&&x1>=0&&y1>=0&&z1>=0&&x1<x&&y1<y&&z1<z&&v[x1][y1][z1]==0)
{
en.times=st.times+1;
en.x=x1;
en.y=y1;
en.z=z1;
q.push(en);
v[x1][y1][z1]=1;
}
}
}
return -1;
}
int main()
{
int i,j,k;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d %d",&x,&y,&z,&t);
for(i=0;i<x;i++)
for(j=0;j<y;j++)
for(k=0;k<z;k++)
scanf("%d",&map[i][j][k]);
if(map[x-1][y-1][z-1]!=1)
{
memset(v,0,sizeof(v));
k=BFS();
printf("%d\n",k);
}
else
printf("-1\n");
}
return 0;
}