#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a,b,c,t,flag;
int map[55][55][55],vis[55][55][55];
void dfs(int x,int y,int z,int step)
{
int i,dx,dy,dz;
int next[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
if(step>t||step>=flag||(a+b+c-step-x-y-z>t)) return ; //边界条件 ,剪枝
if(x==a-1&&y==b-1&&z==c-1) //到达门口
{
flag=step;
return ;
}
for(i=0;i<6;i++)
{
dx=x+next[i][0]; //向6个方向遍历
dy=y+next[i][1];
dz=z+next[i][2];
if(dx<0||dx>=a||dy<0||dy>=b||dz<0||dz>=c) //边界条件
continue;
if(map[dx][dy][dz]==0&&(vis[dx][dy][dz]==0||step<vis[dx][dy][dz])) //寻求没有被访问到的,并用vis寻求所用步数最少的
{
vis[dx][dy][dz]=step;
map[dx][dy][dz]=1; //标记已被访问过
dfs(dx,dy,dz,step+1);
map[dx][dy][dz]=0;
}
}
}
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
scanf("%d %d %d %d",&a,&b,&c,&t);
for(int i=0;i<a;i++) //三维坐标
for(int j=0;j<b;j++)
for(int k=0;k<c;k++)
{
scanf("%d",&map[i][j][k]);
}
memset(vis,0,sizeof(vis)); //vis初始化全为0
flag=1000;
dfs(0,0,0,0); //调用深搜
if(flag==1000) printf("-1\n");
else printf("%d\n",flag);
}
return 0;
}
胜利大逃亡
最新推荐文章于 2022-02-27 12:00:52 发布