标签: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