hdu1253胜利大逃亡bfs

http://acm.hdu.edu.cn/showproblem.php?pid=1253

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
const int INF=10000;//时间初始值为无穷大;
const int MAX=70;
int A,B,C,T;
struct node//表示达到某个矩阵状态 ;
{
    int x;
    int y;
    int z;
    int time;
};
queue<node> Q;//建立队列
int dir[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};//6个方向
int map[MAX][MAX][MAX];//标记矩阵状态
int mintime[MAX][MAX][MAX];//对应标记花费时间
int BFS(node s)
{
    int i;
    Q.push(s);//入队
    node hd;
    while(!Q.empty())
    {
        hd=Q.front();
        Q.pop();
        for(i=0;i<6;i++)
        {
            int x=hd.x+dir[i][0];
            int y=hd.y+dir[i][1];
            int z=hd.z+dir[i][2];
            //判断条件
            if(x>=0&&x<=A-1&&y>=0&&y<=B-1&&z>=0&&z<=C-1&&map[x][y][z]!=1)
            {
                node t;
                t.x=x;
                t.y=y;
                t.z=z;
                t.time=hd.time+1;
                //只有当前时间小于对应时间才入队,保证了最小时间
                if(t.time<mintime[x][y][z])
                {
                    mintime[x][y][z]=t.time;
                    Q.push(t);//入队
                }
            }
        }
    }
    return mintime[A-1][B-1][C-1];
}
int main()
{
    int c;
    node start;
    scanf("%d",&c);
    while(c--)
    {
        scanf("%d%d%d%d",&A,&B,&C,&T);
        for(int i=0;i<A;i++)
        for(int j=0;j<B;j++)
        for(int k=0;k<C;k++)
        {
            scanf("%d",&map[i][j][k]);//读入矩阵状态
            mintime[i][j][k]=INF;
        }
        start.x=start.y=start.z=start.time=0;//初始位置
        mintime[0][0][0]=0;
        int mint=BFS(start);
        if(mint<=T)
        printf("%d\n",mint);
        else
        printf("-1\n");
    }
    return 0;
}

你可能感兴趣的:(hdu1253胜利大逃亡bfs)