簡單BFS 走迷宮

2021-09-30 18:37:58 字數 1771 閱讀 9833

描述

l上次旅行進入了乙個迷宮,他被困在了乙個n*m的矩形迷宮中。l開始在左上角的點,他知道出口在右下角,他可以向四個方向移動到相鄰的點。不過這個迷宮有些魔法,每個格仔有一種顏色,不同的顏色代表不一樣的功能:

如果格仔是紅色的,表示當前格仔無法通行

如果格仔是粉紅,表示格仔可以正常通行

如果是橙色,當前格仔也可以通行,不過會讓l身上散發臭氣

如果是藍色,這個格仔裡有鱷魚,如果l想通過身上要帶有臭氣。

如果格仔是紫色的,l會自動沿原來方向滑向下個格仔,下個格仔還是紫色會一直滑動,直到落到乙個非紫色格仔,或者碰到乙個不能通行的格仔。同時紫色格仔會消除l身上的氣味

l已經頭暈,他找到你,希望你能幫他求出他最少移動多少次可以到達終點,如果不能到輸出-1

輸入第一行2個整數,n,m表示行數和列數

接下來n行m列,表示迷宮

0表示紅色,1表示粉紅,2表示橙色,3表示藍色,4表示紫色

左上角和右下角的數一定是1

輸出最少移動次數,或者-1

樣例輸入

4 41 0 2 1

1 1 4 1

1 0 4 0

1 3 1 1

樣例輸出

10提示

【樣例解釋】 l先向下走1步,然後向右2步,滑行1步,向上走1步,向左1步,向下1步,滑行2步,向右1步,一共10步 【資料規模】 1<=n,m<=1000

標籤usaco2015dec

analysis

啊啊啊啊……悲傷

果然頹了太久,連 bfs 和 dfs 都不分了,難受(╯﹏╰)

敲了好久的dfs,不停死迴圈

打著bfs的頭號,寫了一發dfs

然後改用dp????寫完了一調,發現完全不對啊

以後一定要想清楚了再動手

和最短路有關,肯定是bfs啊

沒什麼好分析的,就是搜啊……

code

#include

#define in read()

#define int long long

#define re register

using

namespace std;

inline

intread()

return f==

1?res:

-res;

}const

int n=

2009

;int n,m,col[n]

[n],ans=

(1ll

<<62)

;bool vis[n]

[n][2]

;int f[n]

[n][3]

;int d[4]

[2]=

;struct node

;inline

intcheck

(int x,

int y,

int c)

void

bfs())

;while

(!q.

empty()

)if(col[xx]

[yy]==2

) ncl=1;

if(f[xx]

[yy]

[ncl]

<=nstp)

continue

; f[xx]

[yy]

[ncl]

=nstp;

q.push

((node));

}}}signed

main()

BFS 走迷宮問題

已知圖g v,e 和乙個源頂點s,寬度優先搜尋以一種系統的方式探尋g的邊,從而 發現 s所能到達的所有頂點,並計算s到所有這些頂點的距離 最少邊數 該演算法同時能生成一棵根為s且包括所有可達頂點的寬度優先樹。對從s可達的任意頂點v,寬度優先樹中從s到v的路徑對應於圖g中從s到v的最短路徑,即包含最小...

bfs入門 走迷宮

題意 給乙個n m的二維陣列,s表示入口,t表示出口,點表示牆不可達,表示路可達。求s走到到t的最短距離。輸入樣例 5 6.s t.輸出樣例 include include include include include include include using namespace std con...

BFS 電子老鼠走迷宮

如下圖12 12方格圖,找出一條自入口 2,9 到出口 11,8 的最短路徑。輸入 第一行為乙個數n,表示迷宮大小 第二行為4個數,表示起點和終點 第三起為n n的矩陣,0表示通路,1表示牆。輸出 第一行為路徑 見樣例 第二行為總的步數 表示不會用迴圈佇列 用乙個佇列存要搜的節點,搜過的節點刪除。從...