BFS和DFS的差別 BFS實現迷宮最短路徑

2021-08-31 18:54:44 字數 2355 閱讀 1991

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

bfs能夠求得最短路徑,因為bfs每進行一次相當於當前的路徑長度。對於乙個n*n矩陣,bfs最多執行n*n次。

深度優先搜尋相當於乙個人在走迷宮,廣搜相當於是無窮人沿著不同方向走(因為每條路都同時有人走)。

dfs相當於是乙個下壓棧。是先進後出的原則(如果找不到,往回走,直到回到有路的地方)(dfs隱式使用了棧)

bfs使用佇列,按照與起點的距離來搜尋。

bfs使用乙個佇列來儲存已經被標記但是它的鄰接表還沒有被訪問的頂點。先把起點加入佇列,然後重複以下操作直到隊列為空。

1、取佇列中下乙個頂點v並標記它

2、把和v相鄰的所有沒有標記的頂點加入佇列。

bfs的標記edgeto代表了它的上乙個節點,它的上乙個節點一定只有一種情況,代表了最短解(不一定是唯一的),因為從1,1輻射出來的點不斷地在刷最短路徑。

深度優先搜尋優先尋找離起點最遠的頂點,廣度優先搜尋最先找最近的頂點

深度優先找到的必然是乙個連通分量(因為走到死胡同為止)

hdoj1240

bfs最短路徑

#include 

#include

#include

using

namespace

std;int n;const

int size =12;int matrix[size][size][size];int step[size][size][size];int sx,sy,sz,dx,dy,dz;int tx=;int ty=;int tz=;bool check(int x,int y,int z)typedef

structpoint;int bfs(int x,int y,int z)        }    }    return -1;}int main(int argc, char

const *argv)            }        }        cin>>sx>>sy>>sz>>dx>>dy>>dz;        sx++,sy++,sz++,dx++,dy++,dz++;        cin>>temp;        matrix[sx][sy][sz]=matrix[dx][dy][dz]=1;        int ans = bfs(sx,sy,sz);        if(ans>=0) cout

cout

<

0;}

從別人抄的**有很多收穫:

1.用tx,ty,tz陣列模擬第三個方向的搜尋,非常方便。

2.bfs是用迴圈而不是遞迴完成的,把第乙個點放進去,然後就可以不斷迴圈了,直到隊列為空。

3.佇列api的pop不返回彈出的元素,必須用front

附:stack和queue簡單操作:

1、stack

stack 模板類的定義在標頭檔案中。

stack 模板類需要兩個模板引數,乙個是元素型別,乙個容器型別,但只有元素型別是必要

的,在不指定容器型別時,預設的容器型別為deque。

定義stack 物件的示例**如下:

stack s1;

stack s2;

stack 的基本操作有:

入棧,如例:s.push(x);

出棧,如例:s.pop();注意,出棧操作只是刪除棧頂元素,並不返回該元素。

訪問棧頂,如例:s.top()

判斷棧空,如例:s.empty(),當棧空時,返回true。

訪問棧中的元素個數,如例:s.size()。

2、queue

queue 模板類的定義在標頭檔案中。

與stack 模板類很相似,queue 模板類也需要兩個模板引數,乙個是元素型別,乙個容器類

型,元素型別是必要的,容器型別是可選的,預設為deque 型別。

定義queue 物件的示例**如下:

queue q1;

queue q2;

queue 的基本操作有:

入隊,如例:q.push(x); 將x 接到佇列的末端。

出隊,如例:q.pop(); 彈出佇列的第乙個元素,注意,並不會返回被彈出元素的值。

訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。

訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。

判斷佇列空,如例:q.empty(),當佇列空時,返回true。

訪問佇列中的元素個數,如例:q.size()

給我老師的人工智慧教程打call!

python實現DFS和BFS整理

bfs是廣度遍歷,也就是一層一層擴充套件開的查詢,先把第一層的找完,再找第二層,然後找第三層.使用到的資料結構是佇列,先訪問第乙個節點,然後訪問它的所有鄰接點,然後訪問鄰接點的鄰接點,在此過程中,要保證訪問過的點不重複訪問。dfs是深度遍歷,從乙個點開始,逐漸沿著一條路徑向下查詢,查詢到盡頭的時候,...

DFS和BFS演算法

本質區別 bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。dfs 演算法 是一種利用遞迴 實質上是用棧來儲存未訪問的結點,先進後出 實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 不撞南牆不回頭 樹的先序遍歷 類似。bfs演算法 是一種利用佇列 用佇列來儲...

DFS和BFS演算法

一 深度優先遍歷 深度優先搜尋,是圖論中的經典演算法。其利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。遞迴定義 圖的深度優先遍歷類似於樹的前序遍歷。採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。這種搜尋方法稱為深度優先搜...