一个三维的地图
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int map[55][55][55];
bool vis[55][55][55];
int a,b,c,time,ans;
int dx[]={0,0,0,0,1,-1};
int dy[]={-1,1,0,0,0,0};
int dz[]={0,0,-1,1,0,0};
struct node
{
int x;int y;int z;
int dis;
}Q[1000000];
inline bool istrue(node q)
{
if(q.x>=1&&q.x<=a&&q.y>=1&&q.y<=b&&q.z>=1&&q.z<=c&&!vis[q.x][q.y][q.z]&&!map[q.x][q.y][q.z])
return 1;
return 0;
}
void bfs()
{
node q;
q.x=q.y=q.z=1;
q.dis=0;
int rear=0,front=0;
Q[rear++]=q;
while(front<rear)
{
q=Q[front++];
for(int i=0;i<6;i++)
{
node tt=q;
tt.x+=dx[i];
tt.y+=dy[i];
tt.z+=dz[i];
if(istrue(tt))
{
tt.dis=q.dis+1;
vis[tt.x][tt.y][tt.z]=1;
if(tt.x==a&&tt.y==b&&tt.z==c) {ans=tt.dis;return;}
if(q.dis==time) continue;
Q[rear++]=tt;
}
}
}
}
inline int getint() //优化输入
{
char ch = getchar();
int data = 0;
while (ch < '0' || ch > '9')
ch = getchar();
do
{
data = data*10 + ch-'0';
ch = getchar();
} while (ch >= '0' && ch <= '9');
return data;
}
int main()
{
int t,i,j,k;
scanf("%d",&t);
while(t--)
{
ans=-1;
memset(vis,0,sizeof(vis));
scanf("%d%d%d%d",&a,&b,&c,&time);
for(i=1;i<=a;i++)
for(j=1;j<=b;j++)
for(k=1;k<=c;k++)
map[i][j][k]=getint();
bfs();
printf("%d\n",ans);
}
return 0;
}