牛客練習賽12 B 迷宮 BFS

2021-09-21 06:18:44 字數 1809 閱讀 4384

這是乙個關於二維迷宮的題目。我們要從迷宮的起點 '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
有兩種情況:1.起點->終點 2.起點->鑰匙->門->終點

注意第一種情況可以走鑰匙的格仔,不能走門的格仔。

1 #include 2 using namespace std;

3 char mp[505][505];

4 bool vis[505][505];

5 int n, m;

6 struct pos

7 s, e;

10 int bfs(int x1, int y1, int x2, int y2)

11 ;

13 s.x = x1, s.y = y1, e.x = x2, e.y = y2;

14 queueq;

15 s.step = 0;

16 q.push(s);

17 vis[s.x][s.y] = 1;

18 while(!q.empty())

19

34 }

35 }

36 return -1;

37 }

38 int main()

39 52 mp[sx][sy] = '.', mp[ex][ey] = '.', mp[kx][ky] = '.';

53 int s = bfs(sx, sy, ex, ey);

54 memset(vis, 0, sizeof vis);

55 int s1 = bfs(sx, sy, kx, ky);

56 memset(vis, 0, sizeof vis);

57 mp[dx][dy] = '.';

58 int s2 = bfs(kx, ky, dx, dy);

59 memset(vis, 0, sizeof vis);

60 int s3 = bfs(dx, dy, ex, ey);

61 if(s == -1)

62

66 else printf("%d\n", min(s, (s1 + s2 + s3)));

67 return 0;

68 }

收藏

牛客練習賽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 代表牆壁,是不能進入的位置,除了...