hdu1253-胜利大逃亡 三维BFS

经典三维BFS,此题用DFS会超时,用BFS不剪枝也会超时,其实跟二维的BFS没什么区别

View Code
#include<stdio.h>
#define maxn 31
struct node
{
    int x,y,z;
    int cnt;
};
const int dir[6][3]={{0,-1,0},{-1,0,0},{0,1,0},{1,0,0},{0,0,-1},{0,0,1}};
int map[maxn][maxn][maxn];
int a,b,c,t;

int bfs()
{
    node q[maxn*maxn*maxn];
    node n,p;
    int i,rear=0,front=0;
    n.x=0;n.y=0;n.z=0;n.cnt=0;
    map[0][0][0]=1;
    q[rear++]=n;
    while(front<rear)
    {
        n=q[front++];
        if(n.x==a-1&&n.y==b-1&&n.z==c-1&&n.cnt<=t)return n.cnt;
        if(n.cnt>t)return -1;
        for(i=0;i<6;i++)
        {
            p.x=n.x+dir[i][0];
            p.y=n.y+dir[i][1];
            p.z=n.z+dir[i][2];
            if(p.x>=0&&p.x<a&&p.y>=0&&p.y<b&&p.z>=0&&p.z<c&&map[p.x][p.y][p.z]==0)
            {
                map[p.x][p.y][p.z]=1;
                p.cnt=n.cnt+1;
                q[rear++]=p;
            }
        }

    }
    return -1;
}
int main()
{
    int i,j,k,T;
    //freopen("int.txt","r",stdin);
    scanf("%d",&T);
    for(int w=0;w<T;w++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&t);
        for(i=0;i<a;i++)
        {
            for(j=0;j<b;j++)
            {
                for(k=0;k<c;k++)
                {
                    scanf("%d",&map[i][j][k]);
                }
            }
        }
        if(t<a+b+c-3)printf("-1\n");
        else printf("%d\n",bfs());
    }
    return 0;
}
posted @ 2012-06-02 20:41  To be an ACMan  Views(176)  Comments(0)    收藏  举报