链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
宽度优先搜索:
#include <iostream>
#include<cstdio>
#include<queue>
#define INF 10000000
using namespace std;
class p
{
public:
int x;
int y;
int z;
};
int maze[55][55][55]; //迷宫
int d[55][55][55]; //到各个位置的最短距离
int l,w,h;
const int dx[]={1,0,-1,0,0,0};
const int dy[]={0,1,0,-1,0,0};
const int dz[]={0,0,0,0,1,-1};
int bfs(void)
{
p tem,t;
int nx,ny,nz;
queue<p> que;
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
for(int k=0;k<l;k++)
d[i][j][k]=INF; //初始化为无穷大
tem.x=0;tem.y=0;tem.z=0;
que.push(tem); //将起点加入队列
d[0][0][0]=0;
while(que.size())
{
tem=que.front();
que.pop();
if(tem.z==h-1&&tem.x==w-1&&tem.y==l-1)
break;
for(int i=0; i<6; i++)
{
nz=tem.z + dz[i];
nx=tem.x + dx[i];
ny=tem.y + dy[i];
if(nx>=0&&ny>=0&&nz>=0&&nx<w&&ny<l&&nz<h&&maze[nz][nx][ny]==0&&d[nz][nx][ny]==INF)
{
t.x=nx;
t.y=ny;
t.z=nz;
que.push(t);
d[nz][nx][ny]=d[tem.z][tem.x][tem.y]+1;
}
}
}
return d[h-1][w-1][l-1];
}
int main()
{
//freopen("1.txt","r",stdin);
int k;
int t;
int a,b,c;
int ans;
scanf("%d",&k);
while(k--)
{
scanf("%d%d%d%d",&w,&h,&l,&t);
for(a=0;a<w;a++)
for(b=0;b<h;b++)
for(c=0;c<l;c++)
scanf("%d",&maze[b][a][c]);
ans=bfs();
if(ans<=t)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}