個人對深度優先搜尋和廣(寬)度優先搜尋的理解

2021-07-04 16:56:16 字數 1766 閱讀 3819

迷宮的最短路徑

給定乙個大小為n*m的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數。請注意本題假定一定有一條道路可達。

n = 10 , m = 10 (迷宮如下圖所示。『#』,『*』,『s',『e』分別表示牆壁,通道,起點和終點)

#s######*#

******#**#

*#*##*##*#

*#********

##*##*####

****#****#

*#######*#

****#*****

*####*###*

****#***e#

以前師兄給我說過深搜和廣搜,可是當時的確沒怎麼聽懂,這個暑假又回過頭來學習了一下,還算弄得比較懂了。

所謂深搜就是一條道走到黑,直到沒有路可走了才回頭,個人理解就是「鑽牛角尖」。

深搜就是

#include

#include

#define inf 10000000

#define maxi 10000

using namespace std;

char a[maxi][maxi];

int ans = inf;

int drv[4][2] = ,,,};//4個方向依次搜尋

int n,m;

void dfs(int x,int y,int step)  

a[x][y] = '#';//將這個點標記為已將找過。。

for (int i = 0;i< 4;i++)

}a[x][y] = '*';//如果沒有找到e 並且不能再往下面搜尋,就將路徑還原。

}int main()

int sx,sy;

for (int i = 0;i < n;i++)

}dfs(sx,sy,0);

printf("%d\n",ans);

system("pause");

return 0;

}廣度優先搜尋就是想波浪一樣一層一層的往外搜尋,廣搜通常需要用到優先佇列。

#include

#include

#include

#include

#define inf 10000000

#define maxi 10000

using namespace std;

typedef pairp;//類似與乙個結構體。

char a[maxi][maxi];

int d[maxi][maxi];//到各個位置的最短距離的陣列。

int dx[4][2] = ,,,}; // 方向陣列。

int n,m,sx,sy,ex,ey;//起點座標和終點座標。

int bfs()

//四個方向迴圈。

for (int i = 0;i < 4;i++)}}

return d[ex][ey];

}int main()

for (int i = 0;i for (int j = 0;j < n;j++)

}printf("%d",bfs());

system("pause");

return 0;

}廣搜和深搜一樣都會遍歷所有能夠遍歷到的狀態,因此需要對所有狀態進行處理是使用廣搜也是可以的,但是遞迴函式可以很簡短地編寫,而且狀態的管理也更簡單所以

大多數情況下還是用深搜實現。反之,在求取最短路是深搜要反覆經過同樣的狀態,所以此時還是使用廣搜較好。

深度優先搜尋與寬度優先搜尋

深度優先搜尋類似於樹的先序遍歷,從每個頂點開始深度優先遍歷,對該分支路徑深入遍歷到不能再深入為止,返回上層,若上一層有新的分支路徑,繼續遍歷該分支,直到所有點都被訪問 1 訪問該頂點,並標記為已訪問 2 if 該頂點的連線點未被訪問過 遞迴呼叫dfs 3 重複 2 直到該頂點的所有連線點都被訪問 t...

寬度優先搜尋

include using namespace std const int n 700 const int inf 0x3f3f3f3f int dir 10 int n,a,b,ans 1000000 flag 0 int floor n struct node int check node tm...

寬度優先搜尋

寬度優先搜尋演算法 又稱廣度優先搜尋 是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說...