zoukankan      html  css  js  c++  java
  • hdu 1253 胜利大逃亡

    BFS+剪枝

    不剪枝直接TLE了呀,无语,剪枝真是一门学问,果然,搜索最重要的是剪枝

    #include<iostream>
    #include<queue>
    #include<string>
    #include<algorithm>
    using namespace std;
    int map[51][51][51],vis[51][51][51],a,b,c,mins,T,count1;
    int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};
    bool escape;
    struct node
    {
    	int x,y,z,dis;
    	node(int _x=0,int _y=0,int _z=0,int _dis=0):x(_x),y(_y),z(_z),dis(_dis){};   
    };
    
    void bfs()
    {
    	node f;
    	queue<node> q;
    	f.x=f.y=f.z=1;
    	f.dis=0;
    	q.push(f);
    	vis[1][1][1]=1;
    	while(!q.empty())
    	{
    		node t=q.front();
    		q.pop();
    		if(t.x==a&&t.y==b&&t.z==c&&t.dis<=T)
    		{
    			mins=t.dis;
    			escape=1;
    			return ;
    		}
    		if(t.dis>T) return;
    		for(int l=0;l<6;l++)
    		{
    			int i=t.x+dir[l][0];
    			int j=t.y+dir[l][1];
    			int k=t.z+dir[l][2];
    			if(i<=a&&i>0&&j<=b&&j>0&&k<=c&&k>0 &&!vis[i][j][k]&&map[i][j][k]!=1)
    			{
    				vis[i][j][k]=1;
    				if(t.dis+1+a-i+b-j+c-k>T)//已花时间+之后的最短路径要比总时间短
    					continue;
    				q.push(node(i,j,k,t.dis+1));
    			}
    		}
    	}
    }
    int main()
    {
    	int cas;
    	scanf("%d",&cas);
    	while(cas--)
    	{
    		count1=0;
    		scanf("%d %d %d %d",&a,&b,&c,&T);
    		for(int i=1;i<=a;i++)
    			for(int j=1;j<=b;j++)
    				for(int k=1;k<=c;k++)
    				{
    						scanf("%d",&map[i][j][k]);
    						if(map[i][j][k]!=0)
    							count1++;
    						vis[i][j][k]=0;
    				}
    
    		escape=0;
    		if(a*b*c-count1<a+b+c-2|| T<a+b+c) //这个好理解,可走路径长至少要比最短路径长,而且最短路径一定要比总时间长
    			cout<<-1<<endl;
            else 
    		 {
    			 bfs();
    			 if(escape)
    		  cout<<mins<<endl;
    			 else cout<<-1<<endl;
    		}
    
    	}
    	return 0;
    }
    
  • 相关阅读:
    druid-1.0.13 数据库配置文件密码加密
    PostConstruct注解
    easyui formatter 返回easyui组件
    小师妹问 easyUI mergeCells 行合并后表头和内容对不齐
    Java Split以竖线作为分隔符
    Integer比较值的时候小心使用
    js 关键字 in
    Asp.net中防止用户多次登录的方法
    C#取得站点跟目录
    解读支付宝接口实现步骤
  • 原文地址:https://www.cnblogs.com/nanke/p/2123778.html
Copyright © 2011-2022 走看看