做題目的時候,遇見了兩個型別十分相似的題目,可以乙個直接輸出最短的步數,乙個要儲存,,這個就很犯難
然後通過這兩題,有重新了解了乙個bfs與dfs的區別
一、路徑的輸出
1.dfs
dfs其實就是一直順著乙個方向不斷的搜尋知道找到了目標為止。路徑輸出的時候,利用記錄前面的點即可
#include#include#include#includeusing namespace std;
#define n 9
int cnt;
struct pointpath[n*n];
int maze[n][n];
int vis[n][n];
int dir[4][2]=,,,};
point star,end;
void output()
void dfs(int x,int y,int step)
for(int i=0;i<4;i++)
}}int main()
2 bfs
bfs就是不斷向四周擴充套件,然後找到目標節點,利用陣列模擬佇列(或者直接利用stl的佇列,可是stl裡面的佇列用於儲存路徑有些麻煩,適用於求最小步數)
#include#include#include#include#includeusing namespace std;
#define maxn 500010
#define n 10
int ans,end;
int sx,sy,ex,ey;
int vis[n][n];
int dir[8][2]=,,,,,,,};
char mp[n][n];
struct pointp[maxn];
void bfs()
}}void output(int x)
int main()
深搜與廣搜
深搜是一種一條路走到黑,碰壁就倒退的演算法。運用遞迴思想,如果到了不符合條件的節點就撤回一步,然後再選擇另一條路走下去。如果這個節點的所有路徑都走完了,再撤回一步。最簡單的模板 int x 4 int y 4 上下左右四個方向走。也可以八個方向,這裡我就不寫了。void dfs int fx,int...
廣搜與深搜演算法
bfs 廣度優先搜尋 從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點 第一層點 然後再以他們為 起點 再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是...
廣搜和深搜
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...