Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
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
11
#include <cstdio> #include <cstring> #include <queue> using namespace std; int n,m,k,t; int map1[51][51][51]; int vis[51][51][51]; int dx[]={-1,0,1,0,0,0}; int dy[]={0,1,0,-1,0,0}; int dz[]={0,0,0,0,1,-1}; struct A{ int x,y,z,step; }f,g; int bfs(int x,int y,int z) { queue<A> Q; f.x=x; f.y=y; f.z=z; f.step=0; vis[x][y][z]=1; Q.push(f); while(!Q.empty()) { f=Q.front(); Q.pop(); if(f.x==n-1&&f.y==m-1&&f.z==k-1&&f.step<=t) return f.step; for(int i=0;i<6;i++) { g.x=f.x+dx[i]; g.y=f.y+dy[i]; g.z=f.z+dz[i]; if(g.x>=0&&g.x<n&&g.y>=0&&g.y<m&&g.z>=0&&g.z<k&&!map1[g.x][g.y][g.z]&&!vis[g.x][g.y][g.z]) { vis[g.x][g.y][g.z]=1; g.step=f.step+1; Q.push(g); } } } return -1; } int main() { int cas,ans; scanf("%d",&cas); while(cas--) { memset(vis,0,sizeof(vis)); scanf("%d %d %d %d",&n,&m,&k,&t); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { for(int l=0;l<k;l++) { scanf("%d",&map1[i][j][l]); } } } ans=bfs(0,0,0); printf("%d\n",ans); } return 0; }