胜利大逃亡
Problem Description
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
Input
特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
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
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int flag[60][60][60];
int ss[60][60][60];
int A,B,C,T;
bool isarea(int z,int x,int y)
{
return (z>=0&&z<A&&x>=0&&x<B&&y>=0&&y<C);
}
int m[4]={1,0,-1,0};
int n[4]={0,1,0,-1};
int p[2]={1,-1};
struct lmx{
int x;
int y;
int z;
int time;
};
lmx lm[150000];
int bfs()
{
int head=0,rear=0,i,xx,yy,zz;
lm[rear].z=0;
lm[rear].x=0;
lm[rear].y=0;
lm[rear].time=0;
rear++;
flag[0][0][0]=1;
while(head<rear)
{
lmx s=lm[head];
if(s.time>T) return -1;
if(s.z==A-1&&s.x==B-1&&s.y==C-1&&s.time<=T) return s.time;
for(i=0;i<6;i++)
{
if(i>=0&&i<4)
{
zz=s.z;
xx=s.x+m[i];
yy=s.y+n[i];
}
else
{
xx=s.x;
yy=s.y;
zz=s.z+p[i-4];
}
if(isarea(zz,xx,yy)&&flag[zz][xx][yy]==0)
{
lm[rear].x=xx;
lm[rear].y=yy;
lm[rear].z=zz;
lm[rear].time=s.time+1;
flag[zz][xx][yy]=1;
rear++;
}
}
head++;
}
return -1;
}
int main()
{
int i,j,k,ca;
scanf("%d",&ca);
getchar();
while(ca--)
{
scanf("%d%d%d%d",&A,&B,&C,&T);
memset(flag,0,sizeof(flag));
for(k=0;k<A;k++)
{
for(i=0;i<B;i++)
{
for(j=0;j<C;j++)
{
scanf("%d",&ss[k][i][j]);
if(ss[k][i][j]==1) flag[k][i][j]=1;
}
}
}
printf("%d\n",bfs());
}
return 0;
}