牛客練習賽12 B 迷宮 BFS

2021-08-15 13:25:48 字數 1993 閱讀 8607

這是乙個關於二維迷宮的題目。我們要從迷宮的起點 『s』 走到終點 『e』,每一步我們只能選擇上下左右四個方向中的乙個前進一格。 『w』 代表牆壁,是不能進入的位置,除了牆壁以外的地方都可以走。迷宮內的 『d』 代表一道上鎖的門,只有在持有鑰匙的時候才能進入。而 『k』 則代表了鑰匙,只要進入這一格,就會自動地拿到鑰匙。最後 『.』 則是代表空無一物的地方,歡迎自在的遊蕩。

本題的迷宮中,起點、終點、門跟鑰匙這四個特殊物件,每乙個恰好會出現一次。而且,此迷宮的四周 (最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是牆壁。

請問,從起點到終點,最少要走幾步呢?

輸入的第一行有兩個正整數h, w,分別代表迷宮的長跟寬。

接下來的h行代表迷宮,每行有乙個長度恰為w的字串,此字串只包含's','e','w','d ','k','.'這幾種字元。

請在一行中輸出乙個整數代表答案,如果無法從起點走到終點,請輸出-1。

4 12

wwwwwwwwwwww

we.w.s..w.kw

w..d..w....w

wwwwwwwwwwww

20

6 6

wwwwww

wews.w

w.wk.w

w.wd.w

w.w..w

wwwwww

-1

4 ≤ h, w≤ 500

『s』, 『e』, 『k』, 『d』各出現恰好一次

迷宮的四周(最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是 『w』

題意: 略

分析: bfs的題做的也不得多,再加上好久沒寫過了,有點生疏,碼風也不好。具體思路呢就是要麼是直接從s -> e 要麼 是 s -> k -> e,然後直接乙個bfs就行了,如果都走不到的話就返回-1,可以的話兩者取短的即可,主要是check函式,當 從 k 走到 e 的時候可以經過d(也就是鎖),而其他情況則不可以

#include

using

namespace

std;

const

int inf = 100000000,maxn = 555;

const

int move[4][2] = ;

char mp[maxn][maxn];

bool vis[maxn][maxn];

int s[maxn][maxn];

int sx,sy,kx,ky;

int n,m;

bool check(int x,int y,char it,char to) else

if(it == 'k')

return

false;

}int bfs(char it,char to) else x = kx,y = ky;

vis[x][y] = true;

s[x][y] = 0;

queue

int,int> > q;

q.push(make_pair(x,y));

while(!q.empty())

if(check(tox,toy,it,to)) }}

return inf;

}int main()

if(mp[i][j] == 'k')

}int step1 = bfs('s','e');

int step2 = bfs('s','k') + bfs('k','e');

if(min(step1,step2) >= inf) cout

<<-1

cout

0;}

牛客練習賽12 B 迷宮 BFS

這是乙個關於二維迷宮的題目。我們要從迷宮的起點 s 走到終點 e 每一步我們只能選擇上下左右四個方向中的乙個前進一格。w 代表牆壁,是不能進入的位置,除了牆壁以外的地方都可以走。迷宮內的 d 代表一道上鎖的門,只有在持有鑰匙的時候才能進入。而 k 則代表了鑰匙,只要進入這一格,就會自動地拿到鑰匙。最...

牛客練習賽12 B 迷宮

牛客練習賽12 b 迷宮 這道題比以前的迷宮問題多了一道門 d 必須有 k 才能過門 以前我們用bfs搜尋來解決這種問題,每個 只能經過一次 而此時每個 能夠經過兩次,分別為有 k 和無 k include include include include include include define...

nowcoder 練習賽12 迷宮(bfs)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 這是乙個關於二維迷宮的題目。我們要從迷宮的起點 s 走到終點 e 每一步我們只能選擇上下左右四個方向中的乙個前進一格。w 代表牆壁,是不能進入的位置,除了...