题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
思路:简单的bfs,就是要注意剪枝。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> using namespace std; int a[55][55][55],x,y,z,t,ans,vis[55][55][55]; int zz[10][10]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}}; struct Node{ int x,y,z,num; }; bool bfs() { int i,j,k; queue <Node> q; memset(vis,0,sizeof(vis)); Node tmp,tp; tmp.x=1;tmp.y=1;tmp.num=0;tmp.z=1; vis[1][1][1]=1; q.push(tmp); while(!q.empty()) { tmp=q.front(); q.pop(); if(tmp.x==x&&tmp.y==y&&tmp.z==z&&tmp.num<=t) { ans=tmp.num;return true; } if(tmp.num>t) return false; for(int i=0;i<6;i++) { tp.x=tmp.x+zz[i][0]; tp.y=tmp.y+zz[i][1]; tp.z=tmp.z+zz[i][2]; tp.num=tmp.num+1; if(tp.num>t) continue; if(tp.x<1||tp.x>x||tp.y<1||tp.y>y||tp.z<1||tp.z>z) continue; if(a[tp.x][tp.y][tp.z]==1||vis[tp.x][tp.y][tp.z]==1) continue; vis[tp.x][tp.y][tp.z]=1; if(abs(tp.x-x+1)+abs(tp.y-y+1)+abs(tp.z-z+1)+tp.num>t) continue; //剪枝,判断剩余时间能否到达终点 q.push(tp); } } return false; } int main(void) { int T,i,j,k; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&x,&y,&z,&t); for(i=1;i<=x;i++) for(j=1;j<=y;j++) for(k=1;k<=z;k++) scanf("%d",&a[i][j][k]); if(bfs()==true) printf("%d ",ans); else printf("-1 "); } }