您的位置:首页 > 其它

hdu(1253)胜利大逃亡(队列+搜索)

2013-08-15 16:15 483 查看
本来用优先队列,没想到超时厉害。。

最后改成队列,立刻过了,竟然比优先队列快乐进千毫秒。。

#include"stdio.h"

#include"string.h"

#include"queue"

using namespace std;

int a,b,c,T;

struct point

{

int x,y,z;

int step;

};

int dir[6][3]={0,0,1, 0,0,-1, 1,0,0, -1,0,0, 0,1,0, 0,-1,0};

int visit[52][52][52];

int map[52][52][52];

int judge(int x,int y,int z)

{

if(x<0||x>=a||y<0||y>=b||z<0||z>=c||visit[x][y][z]||map[x][y][z]==1)

return 0;

return 1;

}

int dfs()

{

int i,x,y,z;

queue<point>q;

point cur,next;

cur.x=0,cur.y=0,cur.z=0,cur.step=0;

visit[0][0][0]=1;

q.push(cur);

while(!q.empty())

{

next=q.front();

q.pop();

if(next.step>=T)//注意t时刻时主人就已经回来了,跑不了了。。

return -1;

if(next.x==a-1&&next.y==b-1&&next.z==c-1&&next.step<T)

return next.step;

for(i=0;i<6;i++)

{

x=next.x+dir[i][0];

y=next.y+dir[i][1];

z=next.z+dir[i][2];

if(judge(x,y,z))

{

cur.x=x;

cur.y=y;

cur.z=z;

cur.step=next.step+1;

q.push(cur);

visit[x][y][z]=1;

}

}

}

return -1;

}

int main()

{

int i,j,k,p;

scanf("%d",&p);

while(p--)

{

scanf("%d%d%d%d",&a,&b,&c,&T);

for(i=0;i<a;i++)

for(j=0;j<b;j++)

for(k=0;k<c;k++)

scanf("%d",&map[i][j][k]);

memset(visit,0,sizeof(visit));

printf("%d\n",dfs());

}

return 0;

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