東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。
input輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。
output輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。
sample input0 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此題是在乙個圖中搜尋路徑的問題,且圖的規模不大,可以用**廣度優先搜尋(bfs)**解決:(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)
首先將起始節點加入佇列,並將起點標記為「被訪問過」
接著進行下面的迴圈體:
①從佇列中取出乙個節點
②訪問該點周圍的未被訪問過的節點
③將剛訪問過的節點加入到佇列中
其中,訪問某一點周圍的節點、迴圈體的退出條件需要視具體情況而定,記錄乙個點是否被訪問過有很多種資料結構可以實現。
在本題中,當從佇列取出的點為(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是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...