這個是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 起點 ...