HDOJ搜索专题之胜利大逃亡

BFS,走三维迷宫。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #define N 50
 5 using namespace std;
 6 typedef struct node
 7 {
 8   int x,y,z;
 9 }node;
10 queue<node> Q;
11 node cur,next;
12 int dx[6]={1,-1,0,0,0,0};
13 int dy[6]={0,0,1,-1,0,0};
14 int dz[6]={0,0,0,0,1,-1};
15 int g[N][N][N],t[N][N][N];
16 int a,b,c,tmax,ans;
17 void bfs()
18 {
19   bool success=false;
20   memset(t,0xff,sizeof(t));
21   cur.x=cur.y=cur.z=0;
22   t[0][0][0]=0;
23   while(!Q.empty()) Q.pop();
24   Q.push(cur);
25   while(!Q.empty() && !success)
26   {
27     cur=Q.front(),Q.pop();
28     ans=t[cur.x][cur.y][cur.z];
29     if(cur.x==a-1 && cur.y==b-1 && cur.z==c-1 && ans<=tmax) success=true;
30     for(int d=0;!success && d<6;d++)
31     {
32       next=cur;
33       next.x+=dx[d];
34       next.y+=dy[d];
35       next.z+=dz[d];
36       if(next.x<0 || next.x>=a) continue;
37       if(next.y<0 || next.y>=b) continue;
38       if(next.z<0 || next.z>=c) continue;
39       if(g[next.x][next.y][next.z]) continue;
40       if(t[next.x][next.y][next.z]!=-1) continue;
41       ans=t[next.x][next.y][next.z]=t[cur.x][cur.y][cur.z]+1;
42       if(next.x==a-1 && next.y==b-1 && next.z==c-1 && ans<=tmax) success=true;
43       else if(t[next.x][next.y][next.z]<tmax) Q.push(next);
44     }
45   }
46   if(success) printf("%d\n",ans);
47   else  puts("-1");
48 }
49 int main()
50 {
51   int T,i,j,k;
52   scanf("%d",&T);
53   while(T--)
54   {
55     scanf("%d%d%d%d",&a,&b,&c,&tmax);
56     for(i=0;i<a;i++)
57     {
58       for(j=0;j<b;j++)
59       {
60         for(k=0;k<c;k++)  scanf("%d",&g[i][j][k]);
61       }
62     }
63     bfs();
64   }
65   return 0;
66 }

 

posted @ 2012-05-16 17:21  BeatLJ  阅读(201)  评论(0编辑  收藏  举报