nowcoder 練習賽12 迷宮(bfs)

2021-08-15 13:31:02 字數 2760 閱讀 5184

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

題目描述

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

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

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

輸入描述:

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

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

輸出描述:

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

示例1

輸入 4 12

wwwwwwwwwwww

we.w.s..w.kw

w..d..w….w

wwwwwwwwwwww

輸出 20

示例2

輸入 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,lg卡在了83.33%,

其實只需要 三次bfs就可以。 一次bfs:找出起點到終點的距離tmp1, 兩次bfs找出起點到鑰匙的距離tmp2,鑰匙到終點的距離t***。 取其中較小者,判斷是否inf

【bfs】

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mem(a,n) memset(a,n,sizeof(a))

#define memc(a,b) memcpy(a,b,sizeof(b))

#define rep(i,a,n) for(int i=a;i///[a,n)

#define dec(i,n,a) for(int i=n;i>=a;i--)///[n,a]

#define pb push_back

#define io ios::sync_with_stdio(false)

#define fre freopen("in.txt","r",stdin)

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

double pi=acos(-1.0);

const

double eps=1e-8;

const

double e=2.7182818;

const

int inf=0x3f3f3f3f;

const

int mod=998244353;

const

int n=5e2+5;

const ll maxn=5e4;

const

int dir[4][2]= ;

int h,w;

char a[n][n];

bool vis[n][n];

struct node

};bool in(int x,int y)///判斷座標(x,y)是否合法

int bfs(int x,int y,int tx,int ty)}}

return inf;

}int main()

}int tmp1=bfs(sx,sy,ex,ey);

int tmp2=bfs(sx,sy,kx,ky);

a[dx][dy]='.';

int t***=bfs(kx,ky,ex,ey);

int ans=min(tmp1,tmp2+t***);

if(ans==inf) cout

<<-1

cout

0;}

牛客練習賽12 B 迷宮

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

牛客練習賽12 B 迷宮 BFS

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

牛客練習賽12 B 迷宮 BFS

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