HDU 1253 胜利大逃亡

用dfs会超时,而且BFS不剪枝的话也会超时。。。三维搜索。。。
搜索题,三维BFS,设定前后上下左右6个方向搜索
1.刚开始一直WA,我就一直找不出错误,后来在看这个题时才发现自己犯了个严重的错误,刚开我就把城堡四周赋值为1,后来就没这样初始化了;现在想想吧太不应该了;
2、要认清剪枝的重要性,剪枝非常有利于提高代码的效率,就这题而言,若没有if(a+b+c-3>t) {printf("-1\n");continue;}(起点与终点间最短路径大于时间限度),虽然没超时;

#include<stdio.h>
#include
<stdlib.h>
struct node
{
int x,y,z,time;

}T[
200024];
int dis[6][3]={ {1,0,0},{0,-1,0},{-1,0,0},{0,1,0},{0,0,1},{0,0,-1} };
int map[54][54][54],N,M,H;
int BFS( int x,int y,int z,int time )
{
int first=0,end=0;
node t;
t.x
=x;t.y=y;t.z=z;t.time=0;
if( x==N&&y==M&&z==H ) return 0;
map[x][y][z]
=1;
T[end
++]=t;
while( first<end )
{
if( T[first].time<time )
for( int i=0;i<6;i++ )
{
int dx=T[first].x+dis[i][0];
int dy=T[first].y+dis[i][1];
int dz=T[first].z+dis[i][2];
if( N==dx&&M==dy&&H==dz )
{
if( map[N][M][H]==1 )
return -1;
return T[first].time+1;
}
if( map[dx][dy][dz]==0 )
{
t.x
=dx;t.y=dy;t.z=dz;t.time=T[first].time+1;
map[dx][dy][dz]
=1;
T[end
++]=t;
}
}
first
++;
}
return -1;
}
int main( )
{
int T;

scanf(
"%d",&T );
while( T-- )
{
int time;
for( int i=0;i<54;i++ )
for( int j=0;j<54;j++ )
for( int k=0;k<54;k++ )
map[i][j][k]
=1;
scanf(
"%d%d%d%d",&N,&M,&H,&time );
for( int i=1;i<=N;i++ )
for( int j=1;j<=M;j++ )
for( int k=1;k<=H;k++ )
scanf(
"%d",&map[i][j][k] );
if( time<N+M+H-3 ) printf( "-1\n" );
else
{
printf(
"%d\n",BFS( 1,1,1,time ) );
}
}
return 0;
}
posted @ 2011-09-05 14:43  wutaoKeen  阅读(213)  评论(0编辑  收藏  举报