胜利大逃亡(HD1253)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253

代码:

#include <stdio.h>
#include<queue>
#include<memory.h>
using namespace std;
int map[51][51][51];
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int x,y,z,t;
struct Node
{
 int xx,yy,zz,usedtime;
};
Node N,P;
bool judge;
void bfs()
{
  N.xx=N.yy=N.zz=N.usedtime=0;
  map[0][0][0]=1;
  queue<Node> q;
  q.push(N);
  judge=false;
  while(!q.empty())
  {
    N=q.front();
    q.pop();

    if(N.xx==x-1&&N.yy==y-1&&N.zz==z-1&&N.usedtime<=t)
    {
       judge=true;
       break;
    }
    if(N.usedtime>t)
    break;
    for(int i=0;i<6;i++)
    {
      int tx=N.xx+dir[i][0];
      int ty=N.yy+dir[i][1];
      int tz=N.zz+dir[i][2];
      if(tx>=0&&ty>=0&&tz>=0&&tx<x&&ty<y&&tz<z&&map[tx][ty][tz]==0)
      {
         if(N.usedtime+1<=t)
          {
           P.xx=tx;
           P.yy=ty;
           P.zz=tz;
           P.usedtime=N.usedtime+1;
           q.push(P);
           map[tx][ty][tz]=1;
          }
      }
    }
  }
}
int main()
{
  int num;
  scanf("%d",&num);
  int wall;
  for(int i=0;i<num;i++)
  {
    wall=0;
    scanf("%d%d%d%d",&x,&z,&y,&t);
    for(int i=0;i<x;i++)//高
      for(int k=0;k<z;k++)//行
        for(int j=0;j<y;j++)//列
        {
         scanf("%d",&map[i][j][k]);
         if(map[i][j][k]==1)
         wall++;
        }
     if(x*y*z-wall<x+y+z-3||t<x+y+z-3)//能走的路比需要走的路少或者给定的时间比需要的时间少
      printf("-1\n");
    else{
     bfs();
     if(judge)
     printf("%d\n",N.usedtime);
     else
     printf("-1\n");
   }
  }
}

 

posted @ 2013-05-24 21:47  supersnow0622  Views(201)  Comments(0)    收藏  举报