傳送門:神奇的迷宮
題目描述思路磊哥做過很多noip的迷宮題目,發現迷宮都沒有鑰匙和門。
於是磊哥設計捷凡版二維迷宮:
我們要從迷宮的起點 『s』 走到終點 『e』,每一步我們只能選擇上下左右四個方向中的乙個前進一格。
『#』 代表障礙物,是不能進入的位置,除了障礙物以外的地方都可以走。迷宮內的 『d』 代表一道上鎖的門,只有在持有鑰匙的時候才能進入。而 『k』 則代表了鑰匙,只要進入這一格,就會自動地拿到鑰匙。最後 『.』 則是代表空地。起點、終點、門跟鑰匙這四個物件,每乙個恰好會出現一次。
而且,此迷宮的四周 (最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是牆壁。
求走到終點的最少步數。
輸入格式
輸入的第一行有兩個正整數h, w,分別代表迷宮的長跟寬。
接下來的h行代表迷宮,每行有乙個長度恰為w的字串,此字串只包含』s』, 『e』, 『#』, 'd ', 『k』, '.'這幾種字元。
輸出格式
輸出乙個整數代表答案,如果無法從起點走到終點,請輸出-1。
樣例輸入
4 12
############
#e.#.s…#.k#
#…d…#…#
############
輸出
20資料範圍與提示
100%資料滿足:4 ≤ h, w≤ 500
我們用bfs來解決這一道題,同樣,我們也要借助佇列。 每獲取乙個隊首便開始擴充套件,用方向向量與迴圈列舉每乙個可以擴充套件的節點。且當前如果有門要判斷有沒有鑰匙,然後加上一定的剪枝就可以過了。
**本**使用了快讀快出
#include
//萬能標頭檔案
using
namespace std;
int i,j,k,m,n,x,sx,sy,ex,ey,ans,a[
505]
[505
],f[
505]
[505][
2];int dx[5]
=,dy[5]
=;//方向向量
char c;
string s;
struct nodet,tmp;
queueq;
//佇列
void
read
(int
&tmp)
void
print
(int tmp)
intmain()
} t.x=sx,t.y=sy,t.key=
0,t.stp=0;
//初始狀態
f[sx]
[sy][0
]=1;
q.push
(t);
while
(!q.
empty()
) q.
push
(tmp);}
}puts
("-1");
//無法到達
return0;
}
神奇的中醫!神奇的文化!
本草備要 中載 王荊公患偏頭痛,搗萊服汁,仰臥,左痛注右鼻,右痛注左鼻,或兩鼻齊注,數十年患,二註而愈。其中所說萊菔汁就是蘿蔔汁。上邊這段話好人的部落格上都有,但是不知道有幾個人嘗試過,我因長期患偏頭疼終無良方,今天下定決心試上一試,據說中西醫對 頭疼均沒有什麼特效藥物,於是我的偏頭疼也伴隨我十幾年...
神奇的食物
跟男朋友吵架 在公司跟上司鬧矛盾 哎,煩啊 每天都要唉聲嘆氣 愁眉苦臉過日子的你,終於在有一天發現自己雪上加霜,得了慢性頭痛 消化不良 失眠症等眾多毛病。不過不用再發愁了,你馬上就可以看到能夠帶你遠離這些煩惱 幫你治好身心的保護神了!那就是平時就隱身在我們身邊的一些不起眼的食物!心生煩躁時 你說在跟...
神奇的分組
眾所周知小p是乙個十分有愛心的同學,所以他熱衷於各種志願活動,一天小p參加乙個志願活動,由於小p是某名校大學生,所以分組的事情大家想讓小p來做,可是他的高數隻考了4分,顯然不能完成這項任務,所以他就偷偷的讓我來找你幫他解決問題,我想聰明非凡你一定可以解決!已知有n位志願者,需要將他們分為若干個小組,...