ACM题解报告——HD1253
今天AC了杭电OJ的1253题《胜利大逃亡》,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
该题目是一个比较经典立方体迷宫问题,要求在给定的时间内从始点(0,0,0)逃到出口(a-1,b-1,c-1),这里我采用的是BFS(宽度优先搜索)。
代码如下:
#include<iostream>
using namespace std;
int map[55][55][55],a,b,c,times,visit[55][55][55];
int fx[6]={1,-1,0,0,0,0},fy[6]={0,0,1,-1,0,0},fz[6]={0,0,0,0,1,-1};
typedef struct
{
int x;
int y;
int z;
int t;
}Node;
Node node[125005];
int check(int p,int q,int x)
{
int flag=1;
if(p<0||p>=a||q<0||q>=b||x<0||x>=c)
flag=0;
else if(visit[p][q][x]==1)
flag=0;
else if( map[p][q][x]==1)
flag=0;
return flag;
}
void bfs(int m,int n,int h)
{
int i,head,tail,p,q,x;
head=0;
tail=1;
node[1].x=m;
node[1].y=n;
node[1].z=h;
node[1].t=0;
if(m==a-1&&n==b-1&&h==c-1)
{
cout<<"0"<<endl;
return ;
}
while( head!=tail)
{
head++;
for(i=0;i<6;i++)
{
p=node[head].x+fx[i];
q=node[head].y+fy[i];
x=node[head].z+fz[i];
if(check(p,q,x)==1)
{
tail++;
node[tail].x=p;
node[tail].y=q;
node[ tail].z=x;
node[tail].t=node[head].t+1;
visit[node[ tail].x][node[tail].y][node[tail].z]=1;
if(node[tail].x==a-1&&node[tail].y==b-1&&node[tail].z==c-1 )
{
if(node[tail].t>times)
{
cout<<"-1"<<endl;
}
else
cout<<node[ tail].t<<endl;
return ;
}
}
}
}
cout<<"-1"<<endl;
}
int main( )
{
int i,j,k,t;
scanf( "%d",&t);
while(t--)
{
scanf("%d%d%d%d",&a,&b,&c,×);
memset(visit,0,sizeof(visit));
for(i=0;i<a;i++)
for(j=0;j<b;j++)
for( k=0;k<c;k++)
scanf("%d",&map[i][j][k]);
bfs(0,0,0);
}
return 0;
}
hdoj上要C++才能AC,大概900MS左右,G++的话会超时的。