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

来源:互联网 发布:2017淘宝客还能做吗 编辑:程序博客网 时间:2024/05/18 10:50

本来用优先队列,没想到超时厉害。。

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

#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;
}


 

原创粉丝点击