#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
const int N=51;
int A,B,C,step;
int map[N][N][N];
int visited[N][N][N];
int ds[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,-1},{0,0,1}};
struct Cube
{
int x;
int y;
int z;
int step;
}cube[N*N*N];
void bfs()
{
int x,y,z,sp;
queue<Cube> qu;
Cube cub,next;
cub.x=0;
cub.y=0;
cub.z=0;
cub.step=0;
if(A==1&&B==1&&C==1)
{
printf("0\n");
return ;
}
qu.push(cub);
visited[0][0][0]=1;
while(!qu.empty())
{
Cube cc=qu.front();
qu.pop();
for(int i=0;i<6;i++)
{
next.x=x=cc.x+ds[i][0];
next.y=y=cc.y+ds[i][1];
next.z=z=cc.z+ds[i][2];
next.step=sp=cc.step+1;
if(sp>step)
continue;
if(x>=0&&x<A&&y>=0&&y<B&&z>=0&&z<C&&map[x][y][z]==0&&visited[x][y][z]==0)
{
if(x==A-1&&y==B-1&&z==C-1)
{
printf("%d\n",sp);
return ;
}
qu.push(next);
visited[x][y][z]=1;
}
}
}
//system("pause");
printf("-1\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(map,0,sizeof(map));
memset(visited,0,sizeof(visited));
scanf("%d%d%d%d",&A,&B,&C,&step);
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]);
if(A+B+C-3>step)
{
printf("-1\n");
continue;
}
bfs();
}
system("pause");
return 0;
}
poj 1253 三维数组+广搜+减枝
最新推荐文章于 2020-09-23 14:28:42 发布