#include<stdio.h>
struct note
{
int x;//横
int y;//纵
int z;//竖直
int s;
}que[130000];
int a[51][51][51];
int next[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//表示方向的数组
int main()
{
int head,tail;
int flag;
int i,j,k;
int A,B,C,T,tx,ty,tz;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d%d",&A,&B,&C,&T);
for(i=0;i<A;i++)
for(j=0;j<B;j++)
for(k=0;k<C;k++)
scanf("%d",&a[i][j][k]);
if(A==1&&B==1&&C==1)//出口是(A-1,B-1,C-1)
printf("0\n");
else
{
head=tail=0;//初始化
que[head].x=que[head].y=que[head].z=que[head].s=0; //起始坐标
tail++;
a[0][0][0]=1;
flag=0; //用来标记是否到达目标点,0表示暂时还没有达到,1表示达到
while(head<tail) //当不为空时循环
{
if(que[head].s==T)
break;
if(A+B+C-3>T)
break;
tx=que[head].x+next[j][0];
ty=que[head].y+next[j][1];
tz=que[head].z+next[j][2];
if(tx<0||tx>A-1||ty<0||ty>B-1||tz<0||tz>C-1) //判断是否越界
continue;
if(a[tx][ty][tz]==0)
que[tail].y=ty;
que[tail].z=tz;
que[tail].s=que[head].s+1; //时间加1
tail++;
}
if(tx==A-1&&ty==B-1&&tz==C-1&&a[tx][ty][tz]==0) //到达目标,停止扩展
{
flag=1;
break;
}
a[tx][ty][tz]=1;
}
if(flag==1)
break;
head++;//当一个点结束扩展后,才嫩对后面的点扩展
}
if(flag==1)
printf("%d\n",que[tail-1].s);
else
printf("-1\n");
}
}
getchar();getchar();
return 0;
}
struct note
{
int x;//横
int y;//纵
int z;//竖直
int s;
}que[130000];
int a[51][51][51];
int next[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//表示方向的数组
int main()
{
int head,tail;
int flag;
int i,j,k;
int A,B,C,T,tx,ty,tz;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d%d",&A,&B,&C,&T);
for(i=0;i<A;i++)
for(j=0;j<B;j++)
for(k=0;k<C;k++)
scanf("%d",&a[i][j][k]);
if(A==1&&B==1&&C==1)//出口是(A-1,B-1,C-1)
printf("0\n");
else
{
head=tail=0;//初始化
que[head].x=que[head].y=que[head].z=que[head].s=0; //起始坐标
tail++;
a[0][0][0]=1;
flag=0; //用来标记是否到达目标点,0表示暂时还没有达到,1表示达到
while(head<tail) //当不为空时循环
{
if(que[head].s==T)
break;
if(A+B+C-3>T)
break;
for(j=0;j<=5;j++) //六个方向
//尝试下一个点的坐标
{tx=que[head].x+next[j][0];
ty=que[head].y+next[j][1];
tz=que[head].z+next[j][2];
if(tx<0||tx>A-1||ty<0||ty>B-1||tz<0||tz>C-1) //判断是否越界
continue;
if(a[tx][ty][tz]==0)
{
//插入新的点
que[tail].x=tx;que[tail].y=ty;
que[tail].z=tz;
que[tail].s=que[head].s+1; //时间加1
tail++;
}
if(tx==A-1&&ty==B-1&&tz==C-1&&a[tx][ty][tz]==0) //到达目标,停止扩展
{
flag=1;
break;
}
a[tx][ty][tz]=1;
}
if(flag==1)
break;
head++;//当一个点结束扩展后,才嫩对后面的点扩展
}
if(flag==1)
printf("%d\n",que[tail-1].s);
else
printf("-1\n");
}
}
getchar();getchar();
return 0;
}