F - 胜利大逃亡
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<stdio.h>
#include<string.h>
int s[55][55][55],book[55][55][55];
struct s{int x,y,z,n;
};
struct s que[150000];
int main()
{int i,j,k,K,flag;int a,b,c,T,tx,ty,tz,sx,sy,sz;int a1,b1,c1;int h,t;int next[6][3]={
{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};int stx=1,sty=1,stz=1; while(scanf("%d",&K)!=EOF){while(K--){flag=0;memset(book,0,sizeof(book));scanf("%d%d%d%d",&a,&b,&c,&T);for(i=1;i<=a;i++){for(j=1;j<=b;j++){for(k=1;k<=c;k++){scanf("%d",&s[i][j][k]);}}}h=1;t=1;que[t].x=stx;que[t].y=sty;que[t].z=stz;que[t].n=0;t++;while(h<t){for(i=0;i<6;i++){tx=que[h].x+next[i][0];ty=que[h].y+next[i][1];tz=que[h].z+next[i][2];if(tx<1||ty<1||tz<1||tx>a||ty>b||tz>c)continue;if(s[tx][ty][tz]==0&&book[tx][ty][tz]==0){book[tx][ty][tz]=1;que[t].x=tx;que[t].y=ty;que[t].z=tz;que[t].n=que[h].n+1;t++;}if(tx==a&&ty==b&&tz==c){flag=1;break;}}if(flag==1&&que[t-1].n<=T&&s[a][b][c]==0){break;}elseflag=0;h++;}if(flag==1)printf("%d\n",que[t-1].n);elseprintf("-1\n");} }return 0;
}