链接: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;
}