BFS 典型的迷宮問題

2022-06-13 06:06:06 字數 2405 閱讀 4530

這個是bfs搜尋的典型問題,好好整理一下:

給定乙個迷宮,入口為左上角,出口為右下角,問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上、下、左、右、上左、上右、下左、下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。易得可以用1將迷宮圍起來避免邊界問題。

本題採用bfs演算法給出解。注意,利用bfs演算法給出的路徑必然是一條最短路徑。

input:

16 8

0 1 1 1 0 1 1 1

1 0 1 0 1 0 1 0

0 1 0 0 1 1 1 1

0 1 1 1 0 0 1 1

1 0 0 1 1 0 0 0

0 1 1 0 0 1 1 0

output:

yes(1,1) (2,2) (3,3) (3,4) (4,5) (4,6) (5,7) (6,8)

基本思路:

採用bfs的思路,每個位置相當於乙個結點,用bfs進行廣度搜尋,相當於往外一環一環擴散的感覺,最後看能否達到出口的位置。

實現以及技巧:

1.基本的資料結構:相比對於一棵樹的bfs來說,這裡的bfs中的node是乙個座標,因此要自定義好結點,typedef struct nodenode;bfs裡面要用到佇列,對基本的佇列的庫函式的宣告和使用要熟悉,q.size() q.push(node) q.front() 以及q.pop()

2.關於path的問題:由於要儲存路徑資訊,這裡的path是乙個二維的指標陣列,注意這種宣告以及初始化的方式:宣告node **path;初始化:

path=new node*[maxl];

for(i=0;i<=maxl;i++)

應該還有其他的表述方式,總之要會用乙個,這裡涉及到二維時候的指標還是挺麻煩的。

3.還要注意每次path的更新點的選擇問題,在每次元素入隊的時候,比如當前元素為now,檢查它周圍的8個點,讓沒有牆的點入隊,比如乙個沒有牆的點是temp就在這個位置上更新,path[temp.x][temp.y]=now。

4.path輸出的問題也很重要,這個最好就記下來,就是遞迴輸出,比較典型,具體看**的outputpath函式。

5.考慮向周圍移動的時候:向周圍的8個點移動的時候可以先設定好乙個二維陣列:

node move[8]=,,,,,,,};

之後乙個迴圈,把對應的x y值加上去就好,這樣比較省事。注意結構體賦初值的時候也可以用這種小括號的形式:node start=;

6.還有一點容易忽略,想周圍移動的時候,已經探測過的點要做個標記,比如標記成-1或者類似的,這樣就不會繞回去了,否則有可能形成乙個環。

7.還有其他的技巧,就是在地圖初始化的時候,在周圍加上一圈的圍牆,這樣在具體bfs的時候就不用再考慮邊界的問題了。

具體**如下:

//

#include

#include

#include

#include

#define maxh 20

#define maxl 20

using

namespace

std;

typedef

struct

nodenode;

//記錄地圖資訊

intmaze[maxh][maxl];

//記錄路徑資訊

//node*path[maxh][maxl];

node **path;

node move[

8]=,,,,,,,};

bool

bfs(node start,node end)}}

if(tempn.x==end.x&&tempn.y==end.y)

else

}void

outputpath(node end)

else

}return

;

}int

main()

else}}

node start=;

//注意結構體的這種用中括號來賦值的方式

node end=;

//二維指標陣列的規定初始值的方式

//此時path是乙個指向一維指標陣列的指標

path=new node*[maxl];

for(i=0;i<=maxl;i++)

//呼叫bfs函式進行搜尋 更新path矩陣資訊

bool connect=bfs(start,end);

if(connect)

puts(

"yes");

else

puts("no

");//輸出路徑資訊

outputpath(end);

printf(

"(%d,%d)\n

",6,8

);

}return0;

}

迷宮問題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 起點 ...