标签:hdu
Description

Input
Output
Sample Input
1 3 3 4 20 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0
Sample Output
11
题目大意:
一个三维矩阵,给出口入口和时间,问是否能逃出,逃出就输出时间,否则输出-1.
解题报告:
三维BFS.
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct node{
int k,i,j;
node(int k0=0,int i0=0,int j0=0){
k=k0,i=i0,j=j0;
}
};
const int maxN=55;
int dirK[6]={0,0, 0, 0,1,-1},a,b,c,t,g[maxN][maxN][maxN],step[maxN][maxN][maxN];
int dirI[6]={1,0,-1, 0,0,0};
int dirJ[6]={0,1, 0,-1,0,0};
void bfs(){
queue <node> path;
step[0][0][0]=0;
path.push(node(0,0,0));
bool ans=false;
while(!path.empty()&&!ans){
node s=path.front();
if(step[s.k][s.i][s.j]>t) break;
path.pop();
bool ans;
for(int i=0;i<6;i++){
int dk=s.k+dirK[i],di=s.i+dirI[i],dj=s.j+dirJ[i];
if(dk<0||dk>=a||di<0||di>=b||dj<0||dj>=c||g[dk][di][dj]==1) continue;
if(step[dk][di][dj]!=-1) continue;
step[dk][di][dj]=step[s.k][s.i][s.j]+1;
path.push(node(dk,di,dj));
if(dk==a-1&&di==b-1&&dj==c-1){ ans=false;break;}
}
}
printf("%d\n",step[a-1][b-1][c-1]);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&a,&b,&c,&t);
memset(step,-1,sizeof(step));
for(int k=0;k<a;k++){
for(int i=0;i<b;i++){
for(int j=0;j<c;j++){
scanf("%d",&g[k][i][j]);
}
}
}
bfs();
}
return 0;
}
标签:hdu
原文地址:http://blog.csdn.net/hush_lei/article/details/38981547