HDU1253

View Code
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<queue>
 6 #include<algorithm>
 7 #define N 55
 8 int map[N][N][N];
 9 int a,b,c,maxt,ans;
10 int fmin(int i,int j){
11     return i>j?j:i;
12 }
13 using namespace std;
14 struct point {
15     int x,y,z;
16     int lev;
17 };
18 point p,pp;
19 queue<point>q;
20 int dx[6]={0,-1,0,1,0,0};
21 int dy[6]={-1,0,1,0,0,0};
22 int dz[6]={0,0,0,0,1,-1};
23 
24 void bfs(int sz,int sx,int sy){
25     int i,j,k,tx,ty,tz;
26     p.x=sx;
27     p.y=sy;
28     p.z=sz;
29     p.lev=0;
30     while(!q.empty())
31         q.pop();
32     q.push(p);
33     while(!q.empty()){
34         p=q.front();
35         q.pop();
36         if(p.x==b-1&&p.y==c-1&&p.z==a-1){
37             ans=fmin(ans,p.lev);
38         }
39         for(i=0;i<6;i++){
40             pp.x=p.x;
41             pp.y=p.y;
42             pp.z=p.z;
43             pp.x+=dx[i];
44             pp.y+=dy[i];
45             pp.z+=dz[i];
46             if(pp.z<0||pp.z>=a||pp.x<0||pp.x>=b||pp.y<0||pp.y>=c||map[pp.z][pp.x][pp.y]==1)
47                 continue;
48             map[pp.z][pp.x][pp.y]=1;
49             pp.lev=p.lev+1;
50             q.push(pp);
51         }
52     }
53 }
54 
55 int main(){
56     int t,i,j,k;
57     scanf("%d",&t);
58     while(t--){
59         scanf("%d%d%d%d",&a,&b,&c,&maxt);
60         for(i=0;i<a;i++)
61             for(j=0;j<b;j++)
62                 for(k=0;k<c;k++)
63                     scanf("%d",&map[i][j][k]);
64         ans=999999;
65         map[0][0][0]=1;//
66         bfs(0,0,0);
67         if(ans<=maxt)
68             printf("%d\n",ans);
69         else
70             printf("-1\n");
71     }
72     return 0;
73 }
posted @ 2012-08-05 19:19  xxx0624  阅读(464)  评论(0编辑  收藏  举报