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點。走的時候要遵循乙個規則 必須走相鄰的格仔,如果相鄰的格仔為有柱子格仔,那麼這個格仔與有柱子的格仔相鄰的邊 如果乙個有柱子的格仔的兩條或者多條不同的邊 了,那麼這個格仔就會變成...