BFS 標記路徑

2021-10-09 22:19:34 字數 1827 閱讀 7528

bfs:華爾茲

有乙個 n x m 大小的網格,其中有些格點比較特殊,當玩家站在上面的時候會自動移動到相鄰四個方向之一,另外一些格點暫時還並不特殊,因為它們的移動方向還未知,如下圖:

上圖中,第一列和最後一行格點的移動方向未知,其他點的移動方向已經確定了,已經在圖中用箭頭指出其方向。

現在給定乙個起點(上圖中的綠色方塊)和乙個終點(上圖中的紅色方塊),你需要給其中一些移動方向未知的格點確定乙個方向,使得玩家能從起點移動到終點。

如下圖是乙個方案,其中藍色格點標註出了從起點到終點的路徑:

![在這裡插入描述](

輸入描述:

對於乙個關卡,其對應的檔案描述如下。

第一行六個空格隔開的整數 n,m,sx,sy,tx,ty,它們的意義分別如下:

輸出描述:

對於乙個關卡,其對應的輸出檔案為將其輸入檔案中 . 替換為 w, a, s, d 中任意乙個字元的結果,其餘內容與格式不變。

示例1輸入

4 4 1 1 4 4

.aaa

.www

.sss…輸出

4 4 1 1 4 4

saaa

swww

dsss

dddw

bfs水題,大佬請忽略。

此題問的是可不可達,先bfs一邊即可。關鍵是如何記錄『.』的變化,即路徑的變化

一種辦法是與push(x*m+y)類似,搞個二維陣列pre[x][y]來記錄(x,y)是經過何種方向變化得來的。

另一種辦法是與第十屆藍橋杯迷宮那題類似(發過此題可翻找),通過最短路的路徑長度dis[x][y] = dis[dx][dy] + 1來判斷走的是哪一條路,進而判斷是通過wasd哪個方向得來的。

此題過程**現的失誤有:

①存的圖是從(0,0)開始的,給的圖是(1,1)開始的,導致終點應該是(tx-1,ty-1)而不是(tx,ty)。錯誤會導致可能找不到終點。

②對於mp[x][y]!=』.'的點忘記寫出沒出邊界判斷條件了,非常致命。

**如下

#include

#include

#include

#include

#include

using

namespace std;

int dir[4]

[2]=

,,,}

;int tx,ty,sx,sy,n,m;

int vis[

1010][

1010];

char mp[

1010][

1010];

int pre[

1010][

1010];

queue<

int> q;

void

bfs()if

(mp[x]

[y]!=

'.')

}else}}

}}intmain()

}bfs()

;int x = tx-

1,y=ty-1;

while

(pre[x]

[y]!=-1

)//從終點往起點逆推路徑

printf

("%d %d %d %d %d %d\n"

,n,m,sx,sy,tx,ty)

;for

(int i=

0;i)printf

("\n");

}}

BFS標記(BFS染色)

經過多年的征戰,牛牛在與牛可樂的對決漸漸處於下風,於是牛牛決定對牛可樂來一次大圍剿。戰場可以看作一張 n m的地圖,牛可樂的士兵只能上下左右移動,不能斜著移動,牛牛決定挖一圈陷阱包圍牛可樂的士兵。牛牛想知道包圍牛可樂的士兵所需要的最少的陷阱數量是多少 劃掉,具體請看update 但是牛牛並不會排兵布...

POJ3984 迷宮問題(BFS 標記路徑)

每日打卡 1 1 題目大意 01迷宮,0能走1不能走,從左上角走到右下角,要求輸出最短路徑。思路 bfs,汲取前天題目的經驗,採用結構體指標標記路徑,然後輸出。include include include include include include include includeusing n...

bfs 三維標記

做訓練賽遇到的一道題,感覺很好。大致題意 現在給你乙個地圖n m,代表是空格子,代表是有柱子阻隔。現在你站在a點,要走到b點。走的時候要遵循乙個規則 必須走相鄰的格仔,如果相鄰的格仔為有柱子格仔,那麼這個格仔與有柱子的格仔相鄰的邊 如果乙個有柱子的格仔的兩條或者多條不同的邊 了,那麼這個格仔就會變成...