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 }

你可能感兴趣的:(HDU)