您的位置:首页 > 其它

HDU 1253 胜利大逃亡

2016-07-28 19:48 555 查看

胜利大逃亡

[align=left]Problem Description[/align]

Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.

魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.



超级经典的一道广搜求最短路的题,这时我刚刚开始学广搜,这个基本就是清晰的广搜走迷宫的模板。

#include<stdio.h>
#include<string.h>

typedef struct node
{
short x, y, z;
int t;
} Q;
Q q[250002] ;//队列

bool m[51][51][51] ;//迷宫,因为只有0,1状态,所以用bool节省内存
int d[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}} ;//六个方向六种走法,
int A,B,C,T ;

int ok(int x ,int y ,int z)//判断该点是否出边界
{
if(x>=0 && x < A && y >=0 && y < B && z >=0 && z< C)
return 1 ;
return 0 ;
}

void inq(int x ,int y ,int z ,int t,int &tail) //入队,把x,y,z,t放入队中
{
q[tail].x = x ;
q[tail].y = y ;
q[tail].z = z ;
q[tail++].t = t ;
}

int bfs()//广搜函数
{
int head=0 ,tail=1 ,x, y, z,t;
m[0][0][0] = 1;
while(head < tail)//从头开始找路径,头在推后,这样找的全面,找分支,当head=tail时所有找完该结束了
{
x = q[head].x ;
y = q[head].y ;
z = q[head].z ;
t = q[head].t ;//给四个元素赋值
for(int i=0 ; i<6 ; i++)//按顺序进队,分别向六个方向走
{
int x1=x+d[i][0], y1=y+d[i][1], z1=z+d[i][2] ;//x1,y1,z1为移动后的位置
if(ok(x1,y1,z1) && !m[x1][y1][z1])//判断移动后点没有出界且是空点
{
inq(x1,y1,z1,t+1,tail) ;//入队,把x,y,z,t放入队中
m[x1][y1][z1]= 1;//标记为已经访问
}

if(q[tail-1].x == A-1 && q[tail-1].y == B-1 && q[tail-1].z == C-1 && q[tail-1].t <= T)//判断刚刚入队的元素是否为终点,如果是的话返回其用时
return q[tail-1].t;
}
head++;
}
return -1 ;//如果不存在可行解,按规定返回-1
}

int main()
{
int c ;
scanf("%d",&c) ;
while(c--)
{
scanf("%d %d %d %d",&A,&B,&C,&T);
for(int k=0; k<A; k++)
for(int i=0; i<B; i++)
for(int j=0; j<C; j++)
scanf("%d", &m[k][i][j]) ;//初始化数据
printf("%d\n",bfs()) ;//打印用时
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: