程式設計思維 A Maze(廣度優先搜尋)

2021-10-03 13:39:51 字數 2675 閱讀 1883

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

input

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

output

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

sample input

0 1 0 0 0

0 1 0 1 0

0 1 0 1 0

0 0 0 1 0

0 1 0 1 0

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)

此題是在乙個圖中搜尋路徑的問題,且圖的規模不大,可以用**廣度優先搜尋(bfs)**解決:

首先將起始節點加入佇列,並將起點標記為「被訪問過」

接著進行下面的迴圈體:

①從佇列中取出乙個節點

②訪問該點周圍的未被訪問過的節點

③將剛訪問過的節點加入到佇列中

其中,訪問某一點周圍的節點、迴圈體的退出條件需要視具體情況而定,記錄乙個點是否被訪問過有很多種資料結構可以實現。

在本題中,當從佇列取出的點為(x, y)時,搜尋其四周(上、下、左、右)的點:(x-1, y)、(x+1, y)、(x, y-1)、(x, y+1);當從佇列取出的點為終點時,即可退出迴圈體;本題用乙個二維布林陣列visit來記錄節點是否被訪問過:當節點(x, y)被訪問過時,visit[i][j] = true。

本題還要求列印從起點到終點所經過的點。我的做法是:在迴圈體中取出某一點(x, y)後,如果訪問了其下方的節點(x+1, y),則將pair<(x+1, y), (x, y)>加入到map中,pair<(x+1, y), (x, y)>意為(x+1, y)可經由(x, y)到達。當程式搜尋到終點從迴圈體退出後,可以利用map從終點回溯到起點所經過的節點,最後輸出。

#include

#include

#include

#include

#include

#define maxn 6

#define maxm 6

using

namespace std;

bool visit[maxn]

[maxm]

;// 用於標記是否被訪問過,初始化自動為0

int dist[maxn]

[maxm]

;// dist[x][y]表示起點到點(x,y)的距離

int area[maxn]

[maxm]

;// 地圖矩陣

int n, m;

// 起點、終點座標

int sx, sy, tx, ty;

// 4個方向:

const

int dirx=

;const

int diry=

;// 寬蒐用的佇列

queueint,

int>> q;

// key = , value = 表示(x_,y_)由(x,y)到達

mapint,

int>

, pair<

int,

int>> mp;

// 列印用的向量

vectorint,

int>> v;

void

printvector

(vectorint,

int>> v)

}void

bfs(

int sx,

int sy,

int tx,

int ty)}}

}found:

pair<

int,

int> to =

make_pair

(tx, ty)

; v.

push_back

(to)

; pair<

int,

int> from =

(*mp.

find

(to)

).second;

while

(from !=

make_pair(0

,0))

reverse

(v.begin()

, v.

end())

;return;}

intmain()

}// 寬蒐以(1,1)為起點、(5,5)為終點

bfs(1,

1,5,

5);printvector

(v);

return0;

}

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...

廣度優先搜尋

廣度優先搜尋詳解 1.也稱寬度優先搜尋,顧名思義,就是將一棵樹一層一層往下搜。演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k l的其他頂點。bfs是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...