迷宮問題
定義乙個二維陣列:
int maze[5][5]
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
input
乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一解。
output
左上角到右下角的最短路徑,格式如樣例所示。
sample input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
sample output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
1.dfs解法如下:
#include
#include
#include
#include
//數學
#include
//佇列
#include
//棧#include
//精度控制
#include
//字串
#include
//容器
#include
//演算法
using
namespace std;
int count=0;
int a[
100]
[100];
//迷宮大小
int min=int_max;
//用來找到最短路徑
typedef
struct
box;
//定義乙個box類來存放x,y點
box b1[
10000];
//用來儲存當前路徑
box b2[
10000];
//用來儲存最短路徑
int nums=0;
//走的步數
bool c=
false
;//判斷是否能走到終點
void
dfs(box cur,
int count,
int hang ,
int lie)
}else
if(x1+
1[y1]==0
)if(y1-
1>=
0&& a[x1]
[y1-1]
==0)if
(y1+
1[y1+1]
==0)}
}int
main()
} b1[0]
.x=0
;//起點設定為0,0
b1[0]
.y=0
;dfs
(b1[0]
,0,hang,lie);if
(c==1)
else
}
2.bfs解法:
第一版:只能判斷是否能走出迷宮,不能輸出如何走的座標
#include
#include
#include
#include
//數學
#include
//佇列
#include
//棧#include
//精度控制
#include
//字串
#include
//容器
#include
//演算法
using
namespace std;
int a[
100]
[100];
typedef
struct
//若要記錄路徑,則應該運用結點陣列,每遍歷一次,就往結點存當前座標值,最後按順序將結點輸出即可得到路徑
box;
box b1[
10000];
//用來儲存當前路徑
box b2[
10000];
//用來儲存最短路徑
int nums=0;
//走的步數
bool c=
false
;//判斷是否能走到終點
void
bfs(box cur,
int hang ,
int lie)
a.pop();
if(location.x-
1>=
0&& a[location.x-1]
[location.y]==0
)if(location.x+
1[location.y]==0
)if(location.y-
1>=
0&& a[location.x]
[location.y-1]
==0)if
(location.y+
1[location.y+1]
==0)}
}int
main()
} b1[0]
.x=0
; b1[0]
.y=0
;bfs
(b1[0]
,hang,lie);if
(c==1)
else
}
2.正確版本bfs,可以進行正確的輸出
#include
#include
#include
#include
//數學
#include
//佇列
#include
//棧#include
//精度控制
#include
//字串
#include
//容器
#include
//演算法
using
namespace std;
int count=0;
int hang,lie;
int a[
100]
[100];
//迷宮大小
int min=int_max;
typedef
struct
//應該運用結點陣列,每遍歷一次,就往結點存當前座標值,最後按順序將結點輸出即可得到路徑
box;
typedef
struct
queue;
bool c=
false
;//判斷是否能走到終點
void
print
(queue qu,
int cur)
//用來找出原來的路徑,反向找到這一條路徑,因為存入的順序與輸出是相反的
while
(j<
400)
j++;}
}void
bfs(
int x,
int y,
int hang,
int lie)
else
if(p+
1[q]==0)
if(q-
1>=
0&& a[p]
[q-1]==
0)if(q+
1[q+1]==
0)}}
}int
main()
}bfs(0
,0,hang,lie);if
(c==1)
else
}
總結:可以使用這種結構體來儲存資料
typedef
struct
//應該運用結點陣列,每遍歷一次,就往結點存當前座標值,最後按順序將結點輸出即可得到路徑
box;
typedef
struct
queue;
並且也可以創造以這種資料為載體的佇列
typedef
struct
box;
queue a;
BFS解迷宮問題(經典BFS演算法)
問題描述 下圖給出了乙個迷宮的平面圖,其中標記為 1 的為障礙,標記為 0 的為可 以通行的地方。010000 000100 001001 110000 迷宮的入口為左上角,出口為右下角,在迷宮中,只能從乙個位置走到這 個它的上 下 左 右四個方向之一。對於上面的迷宮,從入口開始,可以按drrurr...
蠻力法 求解迷宮問題 DFS和BFS
問題描述 有如圖8 8的迷宮 o x ooooo xoxxooox xoxxoxxo xo xooooxoo xo 其中,o表示通路方塊,x表示障礙方塊。假設入口位置為 0,0 出口為右下角方塊位置 7,7 設計乙個程式求指定入口到出口的一條迷宮路徑。分析 用n表示迷宮大小,用二維陣列maze存放迷...
BFS解迷宮問題(Go實現)
改了現有的c 而來的,所以說實話並不滿意。廣度優先搜尋 又稱廣度優先搜尋,簡稱bfs,以下簡稱廣度搜尋 是連通圖的遍歷策略。它之所以被命名是因為它的思想從乙個頂點v0開始,並在其周圍的乙個廣域範圍內徑向傳播。最直觀的經典例子之一就是在迷宮中行走。我們從頭開始,尋找到終點的最短路徑。許多最短路徑演算法...