迷宮的最短路徑
給定乙個大小為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,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說...