生活随笔
收集整理的這篇文章主要介紹了
NYOJ-523 亡命逃窜(三维立体的BFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
亡命逃竄
時間限制:
1000 ms ?|? 內存限制:
65535 KB 難度:
4 描述
?
? ??從前有個叫hck的騎士,為了救我們美麗的公主,潛入魔王的老巢,夠英雄吧。不過英雄不是這么好當的。這個可憐的娃被魔王抓住了,倍受折磨,生死一線。有一天魔王出去約會了,這可是一個千載難逢的逃命機會。你現在的任務就是判斷一下這個英雄未遂的孩子能不能在魔王回來之前逃出魔王的城堡,成功逃生,最后迎娶我們美麗的公主。
? ? 魔王住在一個城堡里,城堡是一個A*B*C的立方體,可以被表示成A個B*C的矩陣,剛開始hck被關在(0,0,0)的位置,離開城堡的門在(A-1,B-1,C-1)的位置,現在知道魔王將在T分鐘后回到城堡,hck每分鐘能從一個坐標走到相鄰的六個坐標中的其中一個.現在給你城堡的地圖,請你計算出hck能否在魔王回來前離開城堡(只要走到出口就算離開城堡,如果走到出口的時候魔王剛好回來也算逃亡成功),如果可以請輸出需要多少分鐘才能離開,如果不能則輸出-1.
如圖所示,輸入數據中的第0塊的最左上角是hck被關的地方,第A-1塊的最右下角是城堡的出口。按照圖中紅色箭頭方向移動每一層以構成整個城堡。
?
?
輸入輸入數據的第一行是一個正整數K,表明測試數據的數量. 每組測試數據的第一行是四個正整數A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它們分別代表城堡的大小和魔王回來的時間.
然后是A塊輸入數據(先是第0塊,然后是第1塊,第2塊......),每塊輸入數據有B行,每行有C個正整數,代表迷宮的布局,其中0代表路,1代表墻.
(如果對輸入描述不清楚,可以參考上面的迷宮描述,它表示的就是上圖中的迷宮)輸出對于每組測試數據,如果hck能夠在魔王回來前離開城堡,那么請輸出他最少需要多少分鐘,否則輸出-1.樣例輸入 2
3 2 2 10
0 1
0 0
1 1
1 0
0 0
0 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 樣例輸出 -1
11 來源HDU上傳者♀隨風♀ 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <queue>
5
6 using namespace std;
7
8 int map[51][51][51];
9 int dir[6][3]={{- 1,0,0},{0,-1,0},{0,0,-1},{1,0,0},{0,1,0},{0,0,1}};
10
11 struct node
12 {
13 int x;
14 int y;
15 int z;
16 int time;
17 };
18
19 int BFS(int a, int b, int c)
20 {
21 queue <node> q;
22 node t1, t2;
23 t1.time = t1.x = t1.y = t1.z = 0;
24 if(t1.x == a-1 && t1.y == b-1 && t1.z == c-1)
25 return t1.time;
26
27 q.push(t1);
28 map[0][0][0] = 1;
29 while(!q.empty())
30 {
31 t1 = q.front();
32 q.pop();
33 for(int i = 0; i < 6; ++i)
34 {
35 t2.x = t1.x + dir[i][0];
36 t2.y = t1.y + dir[i][1];
37 t2.z = t1.z + dir[i][2];
38 t2.time = t1.time + 1;
39 if(t2.x<0 || t2.x>=a || t2.y<0 || t2.y>=b || t2.z<0 || t2.z>=c || map[t2.x][t2.y][t2.z])
40 continue;
41 if(t2.x == a-1 && t2.y == b-1 && t2.z == c-1)
42 return t2.time;
43 q.push(t2);
44 map[t2.x][t2.y][t2.z] = 1;
45 }
46 }
47 return -1;
48 }
49
50 int main()
51 {
52 int T;
53 scanf("%d",&T);
54 while (T--)
55 {
56 int a, b, c, t;
57 scanf("%d%d%d%d", &a, &b, &c, &t);
58 for(int i = 0; i < a; ++i)
59 for(int j = 0; j < b; ++j)
60 for(int k = 0; k < c; ++k)
61 scanf("%d", &map[i][j][k]);
62
63 int sum = BFS(a, b, c);
64 if(sum <= t)
65 printf("%d\n", sum);
66 else
67 printf("-1\n");
68 }
69 return 0;
70 } ?
轉載于:https://www.cnblogs.com/dongsheng/archive/2013/06/03/3116071.html
總結
以上是生活随笔為你收集整理的NYOJ-523 亡命逃窜(三维立体的BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。