#include <deque>
#define inf 200000
#include<iostream>
#include<queue>
using namespace std;
// 迷宫坐标
int map[59][59][59] = { 0 };
// 可访问标记
int visit[51][51][51] = { 0 };
// 移动方式
int next1[7][4] = { {1,0,0},{-1,0,0}
, {0,1,0},{0,-1,0}
, {0,0,1},{0,0,-1} };
// 声明迷宫大小,及时间
int x = 0, y = 0, z = 0, T = 0;
// 判断能否逃出迷宫
int f = 0;
// bfs
void bfs();
struct node {
int x;
int y;
int z;
int val;
};
int main()
{
int k = 0; scanf("%d", &k);
while (k--)
{
// 输入 x高, y长 ,z长
scanf("%d %d %d %d", &x, &y, &z, &T);
// 输入立体迷宫
for (int x1 = 0; x1 < x; x1++)
{
for (int y1 = 0; y1 < y; y1++)
{
for (int z1 = 0; z1 < z; z1++)
{ visit[x1][y1][z1] = 0;
scanf("%d", &map[x1][y1][z1]);}
}
}
// 队列bfs
bfs();
}
return 0;
}
void bfs()
{
queue<node> arr;
node fir{ 0,0,0,0 };
arr.push(fir);
int ex = x - 1, ey = y - 1, ez = z - 1;
visit[0][0][0] = 1;
int node1 = 1, k = 0;
while (!arr.empty())
{
int num = 0;
if (arr.front().x == ex && arr.front().y == ey && arr.front().z == ez)
{
if (arr.front().val <= T)
cout << arr.front().val << endl;
else
cout << -1 << endl;
return;
}
for (int i = 0; i < 6; i++)
{
node temp{};
int tx = arr.front().x + next1[i][0],
ty = arr.front().y + next1[i][1],
tz = arr.front().z + next1[i][2];
// 下标在数组范围内
// 迷宫中为路
// 未标记过的有效点
if (visit[tx][ty][tz] == 0
&& tx < x && tx >= 0
&& ty < y && ty >= 0
&& tz < z && tz >= 0
&& map[tx][ty][tz] == 0)
{
temp.x = tx;
temp.y = ty;
temp.z = tz;
// 更新最短路(以上一级为参考)
temp.val = arr.front().val + 1;
// 不是目标,进行标记
visit[tx][ty][tz] = 1;
//加入有效点
arr.push(temp);
}
}
// 弹出队列首元素
arr.pop();
}
cout << -1 << endl;
return;
}