迷宮問題(bfs

2021-10-03 23:15:40 字數 1887 閱讀 5227

東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。

input

輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。

output

輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。

sample input

010

0001

0100

1010

0001

0010

10

sample output
(0,

0)(1

,0)(

2,0)

(3,0

)(3,

1)(3

,2)(

2,2)

(1,2

)(0,

2)(0

,3)(

0,4)

(1,4

)(2,

4)(3

,4)(

4,4)

1.定義兩個陣列dx dy,分別儲存上下左右四個移動狀態。定義二維陣列visit,用於標記每個點是否到達。

2.用bfs解決,在bfs函式內,每次取出隊首的點,利用乙個for迴圈遍歷四種狀態,然後判斷邊界、是否到達以及是否遇到牆。將符合條件的點加入最短路徑陣列。當到達終點時,用find函式遞迴輸出。

3.單獨定義乙個陣列pre和兩個自增變數index1和index2,記錄路徑上點的先後關係,用於最終輸出路徑。

#include

#include

using

namespace std;

struct point

;int sx=

0,sy=0;

//定義起點和終點的座標

int dx=

;//兩個陣列用於儲存當前點下一步的移動狀態,上下左右

int dy=

;bool visit[5]

[5];

//到達標記陣列

int a[5]

[5];

//儲存輸入資料的二維陣列

int x_path[25]

,y_path[25]

,pre[25]

;//記錄經過點的橫縱座標,前乙個點的編號

int index1=

0,index2=1;

//分別記錄最短路徑上當前點的前乙個點和當前點的編號

queue q;

void

find

(int i)

}void

bfs())

; visit[sx]

[sy]=1

;//注意起始點的標記

cout<<

"("<", "

<")"

=0; y_path[0]

=0;while

(!q.

empty()

));if

(x==

4&&y==4)

}}}}

intmain()

}bfs()

;return0;

}

1.輸出:

一開始寫的時候天真地在尋找最短路徑的過程中輸出了,對照樣例輸出才恍然大悟,bfs過程中有當前符合條件點,但下一步可能會淘汰掉,只有走完一遍才能確定最短路徑。因此需用乙個陣列記錄每個點的前驅點,最終遞迴輸出。

2.受上學期資料結構影響,佇列上來就直接自己寫了,提交**發現自己程式比別人長許多,回看課件的時候知道用#include就行了,哈哈哈哈我咋忘記stl了呢,我太憨了!

迷宮問題bfs

迷宮問題 採用佇列的廣度優先遍歷 bfs 思想是從乙個頂點v0開始,輻射狀地優先遍歷其周圍較廣的區域 找到的解為最優解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct qutype...

迷宮問題BFS

the code 資料結構迷宮.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include define n 4 定義迷宮為4 4 using namespace std struct pot 為記錄路徑的rec準備,座標 x...

迷宮問題bfs

小明置身於乙個迷宮,請你幫小明找出從起點到終點的最短路程。小明只能向上下左右四個方向移動。輸入包含多組測試資料。輸入的第一行是乙個整數t,表示有t組測試資料。每組輸入的第一行是兩個整數n和m 1 n,m 100 接下來n行,每行輸入m個字元,每個字元表示迷宮中的乙個小方格。字元的含義如下 s 起點 ...