神奇的迷宮

2021-08-29 13:57:21 字數 1591 閱讀 3525

傳送門:神奇的迷宮

題目描述

磊哥做過很多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位志願者,需要將他們分為若干個小組,...