HDU_1253——胜利大逃亡,三围空间BFS

Problem Description
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.

魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.

 

 

Input
输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample Input中的迷宫描述,它表示的就是上图中的迷宫)

特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
 

 

Output
对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.
 

 

Sample Input
1 3 3 4 20 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0
 

 

Sample Output
11
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #define MAX 51
 5 using namespace std;
 6 
 7 typedef struct
 8 {
 9    int x,y,z;
10    int move;
11    int time;
12 }point;
13 point start={0,0,0,0,0};
14 
15 int K,A,B,C,T;
16 const int dir[6][3]={{1,0,0},{-1,0,0},
17                      {0,1,0},{0,-1,0},
18                      {0,0,1},{0,0,-1}};
19 int map[MAX][MAX][MAX];
20 
21 void Bfs(void);
22 bool Check(int,int,int,int,int,int);
23 int main()
24 {
25    scanf("%d",&K);
26    while(K--)
27       {
28          scanf("%d %d %d %d",&A,&B,&C,&T);
29          memset(map,0,sizeof(map));
30          for(int i=0;i<A;i++)
31             for(int j=0;j<B;j++)
32                for(int k=0;k<C;k++)
33                   scanf("%d",&map[i][j][k]);
34                   
35          start.x=start.y=start.z=start.move=0;
36          start.time=T;
37          Bfs();
38       }
39    return 0;
40 }
41 
42 void Bfs(void)
43 {
44    bool mark[MAX][MAX][MAX]={false};
45    mark[0][0][0]=true;
46    queue<point>p;
47    p.push(start);
48    point temp,next;
49    while(!p.empty())
50       {
51          temp=p.front();
52          p.pop();
53          if(temp.x==C-1 && temp.y==B-1 && temp.z==A-1)
54             {
55                printf("%d\n",temp.move);
56                return; 
57             }
58          for(int d=0;d<6;d++)
59             {
60                next.x=temp.x+dir[d][0];
61                next.y=temp.y+dir[d][1];
62                next.z=temp.z+dir[d][2];
63                next.move=temp.move+1;
64                next.time=temp.time-1;
65                if(Check(next.x,next.y,next.z,map[next.z][next.y][next.x],mark[next.z][next.y][next.x],next.time))
66                   {
67                      mark[next.z][next.y][next.x]=true;
68                      p.push(next);
69                   }
70             }   
71       }
72    printf("-1\n");
73    return;  
74 }
75 
76 bool Check(int x,int y,int z,int num,int mark,int time)
77 {
78    if(x>=0&&x<C && y>=0&&y<B && z>=0&&z<A && !mark && !num && time>=0)
79       return true;
80    return false;
81 }
82 /*
83 1
84 3 3 4 20
85 0 1 1 1
86 0 0 1 1
87 0 1 1 1
88 1 1 1 1
89 1 0 0 1
90 0 1 1 1
91 0 0 0 0
92 0 1 1 0
93 0 1 1 0
94 */

 

posted @ 2013-06-10 21:07  瓶哥  Views(212)  Comments(0Edit  收藏  举报