HDU ACM 1253 胜利大逃亡(广搜BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1253
View Code
1 /*题意:在一个三维空间中,一个人从起点走到终点每走一步要一秒,求走到终点的时间。 2 若走到终点的时间小于规定时间,输出时间,否则输出-1 3 4 注意:要清楚X Y Z 个代表哪一个坐标 5 */ 6 #include <iostream> 7 #include <stdio.h> 8 #include <queue> 9 using namespace std; 10 int point[6][3]={0,0,1,0,0,-1,1,0,0,-1,0,0,0,1,0,0,-1,0}; //重点,遍历时的偏移量,向哪个方向遍历 11 12 struct FUN 13 { 14 int x,y,z; 15 int step; //记录步数 16 }; 17 int time; 18 int k,a,b,c,t; 19 int used[1100]; 20 int map[55][55][55]; 21 int BFS() 22 { 23 time = 0; 24 memset(used,0,sizeof(used)); 25 queue <FUN> x; 26 FUN q; 27 q.x=0; 28 q.y=0; 29 q.z=0; 30 q.step=0; 31 x.push(q); 32 map[0][0][0] = 1; 33 while(!x.empty()) 34 { 35 FUN y = x.front(); 36 x.pop(); 37 int i=0; 38 for(i=0;i<6;i++) 39 { 40 q.x = y.x + point[i][0]; 41 q.y = y.y + point[i][1]; 42 q.z = y.z + point[i][2]; 43 q.step = y.step + 1; 44 if(q.x>=0 && q.x<a && q.y>=0 && q.y<b && q.z>=0 && q.z<c) 45 { 46 if(map[q.x][q.y][q.z] == 0) 47 { 48 x.push(q); 49 map[q.x][q.y][q.z] = 1; 50 if(q.step > t) 51 { 52 return 0; 53 } 54 if(q.x == a-1 && q.y == b-1 && q.z == c-1) 55 { 56 return q.step; 57 } 58 } 59 } 60 } 61 } 62 return 0; 63 } 64 int main() 65 { 66 67 while(cin>>k) 68 { 69 while(k--) 70 { 71 int i,j,l; 72 73 cin>>a>>b>>c>>t; 74 for(i=0;i<a;i++) 75 { 76 for(j=0;j<b;j++) 77 { 78 for(l=0;l<c;l++) 79 { 80 scanf("%d",&map[i][j][l]); 81 } 82 } 83 } 84 int m = BFS(); 85 if(m) 86 { 87 cout<<m<<endl; 88 } 89 else 90 { 91 cout<<-1<<endl; 92 } 93 } 94 } 95 return 0; 96 }