HDU 1253 胜利大逃亡 广搜

http://acm.hdu.edu.cn/showproblem.php?pid=1253

题意:

  一个三维的空间坐标分别表示为(x,y,z),Ignatius要从(0,0,0)开始逃,要到出口(A-1,B-1,C-1),他只能往6个方向走(上下左右前后),每走一步算

一个单位时间,要在魔王回来的时候内走到出口(刚好也算逃出)。

 

坑爹:

  这题的数据很恶心,害我WA了很多次,当A==B==C==1的时候也就是入口就是出口的时候,要分入口(出口)是不是墙,如果是则不能逃出,反之可以逃出,

 

解法:

  广搜。

 

View Code
  1 #include<iostream>
  2 #include<queue>
  3 using namespace std;
  4 
  5 const int MAXN  =  50 + 10 ;
  6 int K[MAXN][MAXN][MAXN];
  7 int map[6][3] ={ 1,0,0 , -1,0,0 , 0,1,0 , 0,-1,0 , 0,0,1 , 0,0,-1 };
  8 
  9 struct node
 10 {
 11     int x;
 12     int y;
 13     int z;
 14     int step;
 15 };
 16 
 17 int main()
 18 {
 19     int T;
 20     int A;
 21     int B;
 22     int C;
 23     int N;
 24     cin>>N;
 25         
 26     queue <node> q;
 27     while(N--)
 28     {
 29         scanf("%d%d%d%d",&A,&B,&C,&T);
 30         memset(K,0,sizeof(K));
 31         for(int i = 0 ; i < A ; i ++)
 32         {
 33             for(int j = 0 ; j  <  B ; j++ )
 34             {
 35                 for(int k = 0 ; k < C ; k ++ )
 36                 {
 37                     scanf("%d",&K[i][j][k]);
 38                 }
 39             }
 40         }
 41         if(A == 1 && B == 1 && C == 1)
 42         {
 43             if(K[0][0][0] == 1 )
 44             {
 45                 cout<<"-1"<<endl;
 46             }
 47             else
 48             {
 49                 cout<<"0"<<endl;
 50             }
 51             continue;
 52         }
 53 
 54     /*    if(K[0][0][0] == 1 )
 55         {
 56             cout<<"-1"<<endl;
 57             continue;
 58         }
 59         */
 60         node a;
 61         a.x = 0 ;
 62         a.y = 0 ;
 63         a.z = 0 ;
 64         a.step = 0 ;
 65         K[0][0][0] = 1 ;
 66         q.push(a);
 67         int count = 0;
 68         
 69         while( !q.empty() )
 70         {
 71             a = q.front();
 72             q.pop();
 73         //    cout<<"****"<<a.x<<" "<<a.y<<" "<<a.z<<" "<<a.step<<endl;
 74             if(a.x == A - 1 && a.y == B - 1 && a.z == C - 1 )
 75             {
 76                 count = 1;
 77                 if(a.step <= T )
 78                 {
 79                     cout<<a.step<<endl;
 80                 }
 81                 else
 82                 {
 83                     cout<<"-1"<<endl;
 84                 }
 85                 break;
 86             }
 87             
 88             for( i = 0 ; i < 6 ; i ++ )
 89             {
 90                 node b;
 91                 b.x = a.x + map[i][0];
 92                 b.y = a.y + map[i][1];
 93                 b.z = a.z + map[i][2];
 94                 if( b.x >= 0 && b.x < A && b.y >= 0 && b.y < B && b.z >= 0 && b.z < C )
 95                 {
 96                     if( K[b.x][b.y][b.z] == 0 )
 97                     {
 98                         K[b.x][b.y][b.z] = 1 ;
 99                         b.step = a.step + 1 ;
100                         q.push(b);
101                     }
102                 }
103             }
104             
105         }
106         if(!count)
107         {
108             cout<<"-1"<<endl;
109         }
110         while(!q.empty())
111         {
112             q.pop();
113         }
114     }
115     return 0;
116     
117 } 

 

posted @ 2012-09-04 17:29  pc....  阅读(246)  评论(0)    收藏  举报