1 /**
2 题目描述: Ignatius 被魔王抓走了,有一天魔王出差去了,这可是 Ignatius 逃亡的好机会.
3 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩 阵,刚开始
4 Ignatius 被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现 在知道魔王将
5 在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个 坐标中的其中一个.
6 现在给你城堡的地图,请你计算出 Ignatius 能否在魔王回来前 离开城堡
7 (只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃
8 亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1。
9
10 输入:
11 输入数据的第一行是一个正整数 K,表明测试数据的数量.每组测试数据的第一行是四个正
12 整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的
13 时间.然后是 A 块输入数据(先是第 0 块,然后是第 1 块,第 2 块......),每块输入数据有B行,
14 每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙。
15
16 输出:
17 对于每组测试数据,如果 Ignatius 能够在魔王回来前离开城堡,那么请输出他最少需要
18 多少分钟,否则输出-1.
19
20 样例输入:
21 1
22 3 3 4 20
23 0 1 1 1
24 0 0 1 1
25 0 1 1 1
26 1 1 1 1
27 1 0 0 1
28 0 1 1 1
29 0 0 0 0
30 0 1 1 0
31 0 1 1 0
32 */
33 #include<cstdio>
34 #include<queue>
35 using namespace std;
36
37 bool mark[50][50][50];//标记数组
38 int maze[50][50][50];//存储立方体信息
39 struct N//状态结构体
40 {
41 int x, y, z;
42 int t;
43 };
44
45 queue<N> Q;//队列,队列中的元素是状态
46 int go[][3] =
47 {
48 1, 0, 0,
49 -1, 0, 0,
50 0, 1, 0,
51 0, -1, 0,
52 0, 0, 1,
53 0, 0, -1
54 };
55
56 //广度优先搜索,返回其最少耗时
57 int BFS(int a, int b, int c)
58 {
59 while(Q.empty() == false)//当队列中仍有元素可以扩展时循环
60 {
61 N now = Q.front();//得到队头状态
62 Q.pop();//弹出队头状态
63
64 for(int i = 0 ; i < 6 ; i ++)//以此扩展其留个相邻节点
65 {
66 int nx = now.x + go[i][0];
67 int ny = now.y + go[i][1];
68 int nz = now.z + go[i][2];
69
70 if(nx < 0 || nx >= a || ny < 0 || ny >= b || nz < 0 || nz >= c)//越界
71 continue;
72
73 if(maze[nx][ny][nz] == 1)//路障
74 continue;
75
76 if(mark[nx][ny][nz] == true)//已走过
77 continue;
78
79 N tmp;//新状态
80 tmp.x = nx;
81 tmp.y = ny;
82 tmp.z = nz;
83 tmp.t = now.t + 1;//时间+1
84 Q.push(tmp);
85 mark[nx][ny][nz] = true;//标记该点
86 if(nx == a - 1 && ny == b - 1 && nz == c - 1)//走到终点,返回耗时
87 return tmp.t;
88 }
89 }
90
91 return -1;
92 }
93
94 int main()
95 {
96 int T;
97 scanf_s("%d", &T);//测试样例的个数
98 while(T --)
99 {
100 int a, b, c, t;
101 scanf_s("%d%d%d%d", &a, &b, &c, &t);//迷宫大小以及限时
102 for(int i = 0 ; i < a ; i ++)
103 {
104 for(int j = 0 ; j < b ; j ++)
105 {
106 for(int k = 0 ; k < c ; k ++)
107 {
108 scanf_s("%d", &maze[i][j][k]);//迷宫输入
109 mark[i][j][k] = false;
110 }
111 }
112 }
113
114 while(Q.empty() == false)//清除上次痕迹
115 Q.pop();
116
117 mark[0][0][0] = true;
118 N tmp;
119 tmp.t = tmp.x = tmp.y = tmp.z = 0;//初始状态
120 Q.push(tmp);//将初始状态放入队列
121 int rec = BFS(a, b, c);//广度优先搜索
122
123 if(rec <= t)
124 printf_s("%d\n", rec);//如果所用时间小于限时,打印时间
125 else
126 printf_s("-1\n");
127 }
128
129 return 0;
130 }