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
http://acm.hdu.edu.cn/showproblem.php?pid=1253
#include<bits/stdc++.h>
/*
#include<iostream>
#include<math.h>
#include<queue>
#include<cstring>
*/
using namespace std;
const int MAX=52;
int T;
int box[MAX][MAX][MAX];
int go[MAX][MAX][MAX];
int vis[MAX][MAX][MAX];
const int arr[6]={1,-1,0,0,0,0};
const int brr[6]={0,0,1,-1,0,0};
const int crr[6]={0,0,0,0,1,-1};
typedef struct {
int x;
int y;
int z;
}Node;
queue<Node> q;
int bfs(int a,int b,int c,int time){
Node n1;
n1.x=1;
n1.y=1;
n1.z=1;
q.push(n1);
vis[n1.x][n1.y][n1.z]=1;
while(!q.empty()){
Node n=q.front();
q.pop();
if(n.x==a&&n.y==b&&n.z==c){
if(go[n.x][n.y][n.z]<=time){
return go[n.x][n.y][n.z];
}else
return -1;
}
for(int i=0;i<6;i++){
int x2,y2,z2;
x2=n.x+arr[i];
y2=n.y+brr[i];
z2=n.z+crr[i];
if(x2<1||x2>a||y2<1||y2>b||z2<1||z2>c)
continue;
else{
if(!vis[x2][y2][z2]&&!box[x2][y2][z2]){
Node n2;
n2.x=x2;n2.y=y2;n2.z=z2;
vis[x2][y2][z2]=1;
go[x2][y2][z2]=go[n.x][n.y][n.z]+1;
q.push(n2);
}
}
}
}
return -1;
}
int main(){
int A,B,C;
int n;
cin>>n;
while(n--){
while(!q.empty()) q.pop();
memset(vis,0,sizeof(vis));
memset(go,0,sizeof(go));
cin>>A>>B>>C>>T;
for(int i=1;i<=A;i++){
for(int j=1;j<=B;j++){
for(int k=1;k<=C;k++){
scanf("%d",&box[i][j][k]);
}
}
}
cout<<bfs(A,B,C,T)<<endl;
}
return 0;
}