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;
}
posted @ 2011-08-01 13:21  枕边梦  阅读(145)  评论(0编辑  收藏  举报