http://acm.hdu.edu.cn/showproblem.PHP?pid=1253
题意就不多说了 迷宫类问题 用bfs 即可
AC代码:
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
int A,B,C,T;
int map[55][55][55];
int vis[55][55][55];
int dirx[]={0,0,0,0,1,-1};
int diry[]={0,0,1,-1,0,0};
int dirz[]={1,-1,0,0,0,0};
int flag;
struct node{
int x;
int y;
int z;
int step;
};
int judge(int x,int y,int z){
if (x>=0&&x<A&&y>=0&&y<B&&z>=0&&z<C&&vis[x][y][z]==0&&map[x][y][z]==0)
return 1;
return 0;
}
void bfs(){
queue<node>Q;
node a;
a.x=0;
a.y=0;
a.z=0;
a.step=0;
vis[0][0][0]=1;
Q.push(a);
flag=1;
while (!Q.empty()){
a=Q.front();
Q.pop();
if (a.step>T)//刚开始没加这个判断 超时了 好多次 加了以后 1950ms 险过
{
break;
}
if (a.x==A-1&&a.y==B-1&&a.z==C-1&&a.step<=T){
printf ("%d\n",a.step);
flag=0;
break;
}
for (int i=0;i<6;i++){
node b;
b=a;
b.x+=dirx[i];
b.y+=diry[i];
b.z+=dirz[i];
if (judge(b.x,b.y,b.z)){
b.step++;
vis[b.x][b.y][b.z]=1;
Q.push(b);
}
}
}
if (flag){
printf ("-1\n");
}
}
int main (){
int n;
scanf ("%d",&n);
while (n--){
scanf ("%d%d%d%d",&A,&B,&C,&T);
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]);
}
}
}
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}