您的位置:首页 > 其它

HDU 1253 胜利大逃亡 广搜

2012-09-04 17:29 387 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1253

题意:

  一个三维的空间坐标分别表示为(x,y,z),Ignatius要从(0,0,0)开始逃,要到出口(A-1,B-1,C-1),他只能往6个方向走(上下左右前后),每走一步算

一个单位时间,要在魔王回来的时候内走到出口(刚好也算逃出)。

坑爹:

  这题的数据很恶心,害我WA了很多次,当A==B==C==1的时候也就是入口就是出口的时候,要分入口(出口)是不是墙,如果是则不能逃出,反之可以逃出,

解法:

  广搜。

View Code

#include<iostream>
#include<queue>
using namespace std;

const int MAXN  =  50 + 10 ;
int K[MAXN][MAXN][MAXN];
int map[6][3] ={ 1,0,0 , -1,0,0 , 0,1,0 , 0,-1,0 , 0,0,1 , 0,0,-1 };

struct node
{
int x;
int y;
int z;
int step;
};

int main()
{
int T;
int A;
int B;
int C;
int N;
cin>>N;

queue <node> q;
while(N--)
{
scanf("%d%d%d%d",&A,&B,&C,&T);
memset(K,0,sizeof(K));
for(int i = 0 ; i < A ; i ++)
{
for(int j = 0 ; j  <  B ; j++ )
{
for(int k = 0 ; k < C ; k ++ )
{
scanf("%d",&K[i][j][k]);
}
}
}
if(A == 1 && B == 1 && C == 1)
{
if(K[0][0][0] == 1 )
{
cout<<"-1"<<endl;
}
else
{
cout<<"0"<<endl;
}
continue;
}

/*    if(K[0][0][0] == 1 )
{
cout<<"-1"<<endl;
continue;
}
*/
node a;
a.x = 0 ;
a.y = 0 ;
a.z = 0 ;
a.step = 0 ;
K[0][0][0] = 1 ;
q.push(a);
int count = 0;

while( !q.empty() )
{
a = q.front();
q.pop();
//    cout<<"****"<<a.x<<" "<<a.y<<" "<<a.z<<" "<<a.step<<endl;
if(a.x == A - 1 && a.y == B - 1 && a.z == C - 1 )
{
count = 1;
if(a.step <= T )
{
cout<<a.step<<endl;
}
else
{
cout<<"-1"<<endl;
}
break;
}

for( i = 0 ; i < 6 ; i ++ )
{
node b;
b.x = a.x + map[i][0];
b.y = a.y + map[i][1];
b.z = a.z + map[i][2];
if( b.x >= 0 && b.x < A && b.y >= 0 && b.y < B && b.z >= 0 && b.z < C )
{
if( K[b.x][b.y][b.z] == 0 )
{
K[b.x][b.y][b.z] = 1 ;
b.step = a.step + 1 ;
q.push(b);
}
}
}

}
if(!count)
{
cout<<"-1"<<endl;
}
while(!q.empty())
{
q.pop();
}
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: