勝利大逃亡 hdoj 1253 BFS

2021-09-24 22:45:46 字數 2497 閱讀 1578

ignatius 被魔王抓走了,有一天魔王出差去了,這可是 ignatius 逃亡的好機會.

魔王住在乙個城堡裡,城堡是乙個 abc 的立方體,可以被表示成 a 個 b*c 的矩

陣,剛開始 ignatius 被關在(0,0,0)的位置,離開城堡的門在(a-1,b-1,c-1)的位置,現

在知道魔王將在 t 分鐘後回到城堡,ignatius 每分鐘能從乙個座標走到相鄰的六個

座標中的其中乙個.現在給你城堡的地圖,請你計算出 ignatius 能否在魔王回來前

離開城堡(只要走到出口就算離開城堡,如果走到出口的時候魔王剛好回來也算逃

亡成功),如果可以請輸出需要多少分鐘才能離開,如果不能則輸出-1。

輸入:輸入資料的第一行是乙個正整數 k,表明測試資料的數量.每組測試資料的第

一行是四個正整數 a,b,c 和 t(1<=a,b,c<=50,1<=t<=1000),它們分別代表城堡的

大小和魔王回來的時間.然後是 a 塊輸入資料(先是第 0 塊,然後是第 1 塊,第 2

塊…),每塊輸入資料有 b 行,每行有 c 個正整數,代表迷宮的布局,其中 0 代表路,1

代表牆。

輸出:對於每組測試資料,如果 ignatius 能夠在魔王回來前離開城堡,那麼請輸出他

最少需要多少分鐘,否則輸出-1.

樣例輸入:

13 3 4 20

0 1 1 1

0 0 1 1

0 1 1 1

1 1 1 11 0 0 1

0 1 1 1

0 0 0 0

0 1 1 0

0 1 1 0

樣例輸出:

11

在hdoj上有如下注意事項:

特別注意:本題的測試資料非常大,請使用scanf輸入,我不能保證使用cin能不超時.在本oj上請使用visual c++提交.

思路:廣度優先搜尋(bfs)

在本例中,我們可以注意到這樣乙個細節。在起點走向終點的最短路徑上,到達任意乙個中間結點所用的時間都是起點到達這個結點的最短時間。那麼,在搜尋過程中,若有狀態(x,y,z,t),其中 t 不是從起點到達(x,y,z)的最短時間,那麼我們所要查詢的答案必不可能由該狀態進行若干次擴充套件後得到。

在解答樹上,即我們所要查詢的狀態結點,不可能在該狀態結點的子樹上。有了這個結論,又考慮到廣度優先搜尋中,先查找到的狀態深度必不大於後查詢到的狀態深度(深度與狀態中耗時成正比),所以包含每個立方體中座標的狀態至多被擴充套件一次。例如,當我們第一次查詢到包含點(x,y,z)的座標狀態後,其後查詢到的任意包含該座標的狀態都不必被擴充套件,這是因為在後續被查詢的狀態中,所耗時間 t 必不小於先被查詢到的狀態。這樣,我們限定了每個座標僅有乙個有效狀態,所需遍歷的狀態總數大大降低,在本例中所需遍歷的狀態總數變為 a * b * c,完全在我們可以接受的範圍內。

如果已經超出輸出資料中給定的時間限制,則可以提前剪枝,無需全部搜尋完畢。

#include

#include

#include

using namespace std;

struct n

;int mark[50]

[50][

50];//判斷是否已經遍歷過

int maze[50]

[50][

50];//儲存立方體資訊

queue q;

//廣度優先搜尋的佇列

int mynext[6]

[3]=

;int

bfs(

int a,

int b,

int c,

int t)

//超出時間則直接退出

for(

int i =

0; i <

6; i++)}

return

2000

;//若無法到達終點或者超越了時間限制,則返回乙個比題目t的最大值還要大的時間,用於判斷輸出

}int

main()

}}while

(q.empty()

== false) q.

pop();

n first;

first.x = first.y = first.z =0;

first.t =0;

q.push

(first)

; mark[0]

[0][

0]=1

;int ans =

bfs(a, b, c, t)

;/*if (ans < t) cout << ans << endl;

else cout << -1 << endl;*/

if(ans>t)

printf

("-1\n");

else

printf

("%d\n"

, ans);}

system

("pause");

}

hdoj1253 勝利大逃亡

這個題我mle了好幾次,就意識到剪枝的必要性 改進後的 include include using namespace std int dir 6 3 bool map 50 50 50 儲存地圖 struct pos int main if a b c wall a b c 2 time a b ...

hdu 1253 勝利大逃亡

先前在次處漏掉了,could come的判斷,結果一直wa。if step t could come include include struct q 150000 int head,tail,step,add step flag int input 52 52 52 int end x,end y...

HDU 1253 勝利大逃亡

這個題比較坑的bfs吧,注意如果判邊界的話可能會超時,最好先人為加邊界,然後進行搜尋,搜尋最好是隊尾判斷,因為可能出現起點和終點相同的資料 wa了很久 include include includeusing namespace std const int maxn 52 struct node q...