迷宮問題的DFS解決和BFS解決

2021-10-04 07:46:24 字數 4287 閱讀 5082

迷宮問題

定義乙個二維陣列:

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開始,並在其周圍的乙個廣域範圍內徑向傳播。最直觀的經典例子之一就是在迷宮中行走。我們從頭開始,尋找到終點的最短路徑。許多最短路徑演算法...