hdu-1253(bfs+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253

思路:简单的bfs,就是要注意剪枝。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
int a[55][55][55],x,y,z,t,ans,vis[55][55][55];
int zz[10][10]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};
struct Node{
    int x,y,z,num;
};
bool bfs()
{
    int i,j,k;
    queue <Node> q;
    memset(vis,0,sizeof(vis));
    Node tmp,tp;
    tmp.x=1;tmp.y=1;tmp.num=0;tmp.z=1;
    vis[1][1][1]=1;
    q.push(tmp);
    while(!q.empty())
    {
        tmp=q.front();
        q.pop();
        if(tmp.x==x&&tmp.y==y&&tmp.z==z&&tmp.num<=t) 
        {
            ans=tmp.num;return true;
        }
        if(tmp.num>t) return false;
        for(int i=0;i<6;i++)
        {
            tp.x=tmp.x+zz[i][0];
            tp.y=tmp.y+zz[i][1];
            tp.z=tmp.z+zz[i][2];
            tp.num=tmp.num+1;
            if(tp.num>t) continue;
            if(tp.x<1||tp.x>x||tp.y<1||tp.y>y||tp.z<1||tp.z>z) continue;
            if(a[tp.x][tp.y][tp.z]==1||vis[tp.x][tp.y][tp.z]==1) continue;
            vis[tp.x][tp.y][tp.z]=1;
            if(abs(tp.x-x+1)+abs(tp.y-y+1)+abs(tp.z-z+1)+tp.num>t) continue; //剪枝,判断剩余时间能否到达终点 
            q.push(tp);
        }
    }
    return false;
}
int main(void)
{
    int T,i,j,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&x,&y,&z,&t);
        for(i=1;i<=x;i++)
           for(j=1;j<=y;j++)
              for(k=1;k<=z;k++)
              scanf("%d",&a[i][j][k]);
        if(bfs()==true) printf("%d
",ans);
        else printf("-1
");
    }
}
View Code
原文地址:https://www.cnblogs.com/2018zxy/p/9817713.html