HDU 1253

来源:互联网 发布:数据库设计第三范式 编辑:程序博客网 时间:2024/06/08 10:33

Problem Description
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 queue{    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 tail=1;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) //入队,把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,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) ;//入队,把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 ;}


1 0
原创粉丝点击