链接: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 ",ans); else printf("-1 "); } return 0; }