胜利大逃亡(HD1253)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
代码:
#include <stdio.h>
#include<queue>
#include<memory.h>
using namespace std;
int map[51][51][51];
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int x,y,z,t;
struct Node
{
int xx,yy,zz,usedtime;
};
Node N,P;
bool judge;
void bfs()
{
N.xx=N.yy=N.zz=N.usedtime=0;
map[0][0][0]=1;
queue<Node> q;
q.push(N);
judge=false;
while(!q.empty())
{
N=q.front();
q.pop();
if(N.xx==x-1&&N.yy==y-1&&N.zz==z-1&&N.usedtime<=t)
{
judge=true;
break;
}
if(N.usedtime>t)
break;
for(int i=0;i<6;i++)
{
int tx=N.xx+dir[i][0];
int ty=N.yy+dir[i][1];
int tz=N.zz+dir[i][2];
if(tx>=0&&ty>=0&&tz>=0&&tx<x&&ty<y&&tz<z&&map[tx][ty][tz]==0)
{
if(N.usedtime+1<=t)
{
P.xx=tx;
P.yy=ty;
P.zz=tz;
P.usedtime=N.usedtime+1;
q.push(P);
map[tx][ty][tz]=1;
}
}
}
}
}
int main()
{
int num;
scanf("%d",&num);
int wall;
for(int i=0;i<num;i++)
{
wall=0;
scanf("%d%d%d%d",&x,&z,&y,&t);
for(int i=0;i<x;i++)//高
for(int k=0;k<z;k++)//行
for(int j=0;j<y;j++)//列
{
scanf("%d",&map[i][j][k]);
if(map[i][j][k]==1)
wall++;
}
if(x*y*z-wall<x+y+z-3||t<x+y+z-3)//能走的路比需要走的路少或者给定的时间比需要的时间少
printf("-1\n");
else{
bfs();
if(judge)
printf("%d\n",N.usedtime);
else
printf("-1\n");
}
}
}

浙公网安备 33010602011771号