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 }

浙公网安备 33010602011771号